0

次のような文字列を格納したフィールドの1つにテーブルがあります。

RMaster.dbo.fnFormatDate (GETUTCDATE(), 'Company_Enroll_YYYY-MM-DD.csv')

これをc#コードから呼び出すことができるクエリの一部として使用したいので、クエリは次のようになります。

ThisField、...をmytableから選択します

これは実行可能ですか?

ありがとう。

4

1 に答える 1

1

はい、ネストして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への呼び出しは、おそらく残りのクエリよりも多くのことを殺してしまうでしょう。

于 2012-06-14T20:42:09.323 に答える