次のような文字列を格納したフィールドの1つにテーブルがあります。
RMaster.dbo.fnFormatDate (GETUTCDATE(), 'Company_Enroll_YYYY-MM-DD.csv')
これをc#コードから呼び出すことができるクエリの一部として使用したいので、クエリは次のようになります。
ThisField、...をmytableから選択します
これは実行可能ですか?
ありがとう。
次のような文字列を格納したフィールドの1つにテーブルがあります。
RMaster.dbo.fnFormatDate (GETUTCDATE(), 'Company_Enroll_YYYY-MM-DD.csv')
これをc#コードから呼び出すことができるクエリの一部として使用したいので、クエリは次のようになります。
ThisField、...をmytableから選択します
これは実行可能ですか?
ありがとう。
はい、ネストしてSQL文字列を生成するだけです。
SET NOCOUNT ON;
DECLARE @t TABLE (formula NVARCHAR(MAX));
INSERT @t(formula) SELECT
'RMaster.dbo.fnFormatDate (GETUTCDATE(), ''Company_Enroll_YYYY-MM-DD.csv'')';
DECLARE @sql NVARCHAR(MAX);
SELECT @sql = N'SELECT ' + formula + ', [other columns]
FROM dbo.mytable' FROM @t -- WHERE...;
PRINT @sql;
--EXEC sp_executesql @sql;
編集
複数行のシナリオを処理する1つの方法は次のとおりです。
SET NOCOUNT ON;
CREATE TABLE dbo.src(ID INT, formula NVARCHAR(MAX));
INSERT dbo.src(ID, formula) SELECT
1, 'RMaster.dbo.fnFormatDate (GETUTCDATE(), ''Company_Enroll_YYYY-MM-DD.csv'')'
UNION ALL SELECT
2, 'RMaster.dbo.fnFormatDate (GETUTCDATE(), 'Foo_MM.DD.YYYY.csv'')';
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + CHAR(13) + CHAR(10) + N'UNION ALL SELECT ID, ' + formula + '
FROM dbo.src WHERE ID = ' + CONVERT(VARCHAR(12), ID)
FROM dbo.src -- WHERE...;
SET @sql = STUFF(@sql, 1, 12, '') + ';';
PRINT @sql;
--EXEC sp_executesql @sql;
DROP TABLE dbo.src;
これにより、醜いユニオンクエリが生成されます。
SELECT ID, RMaster.dbo.fnFormatDate (GETUTCDATE(), 'Company_Enroll_YYYY-MM-DD.csv')
FROM dbo.src WHERE ID = 1
UNION ALL SELECT ID, RMaster.dbo.fnFormatDate (GETUTCDATE(), 'Foo_MM.DD.YYYY.csv')
FROM dbo.src WHERE ID = 2;
恐らくひどくもっと複雑なCASE
式を動的に作成することもできますが、各クエリが単一行のシークになるようにIDに適切なサポートインデックスがある限り、これは問題ありません。とにかく、UDFへの呼び出しは、おそらく残りのクエリよりも多くのことを殺してしまうでしょう。