我有一个表,在其中一个字段中我存储了这样的字符串:
RMaster.dbo.fnFormatDate (GETUTCDATE(), 'Company_Enroll_YYYY-MM-DD.csv')
我想将它作为我可以从我的c#代码中调用的查询的一部分,因此查询将如下所示:
选择ThisField,... 来自mytable
这可行吗?
感谢。
答案 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的调用可能会比查询的其余部分更多地杀死你。