使用字段内容作为查询的一部分

时间:2012-06-14 20:19:31

标签: sql-server tsql

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

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

我想将它作为我可以从我的c#代码中调用的查询的一部分,因此查询将如下所示:

选择ThisField,... 来自mytable

这可行吗?

感谢。

1 个答案:

答案 0 :(得分: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的调用可能会比查询的其余部分更多地杀死你。