0

我有一个表,在其中一个字段中我存储了一个这样的字符串:

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;

编辑

这是处理多行场景的一种方法:

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 回答