我有一个表,在其中一个字段中我存储了一个这样的字符串:
RMaster.dbo.fnFormatDate (GETUTCDATE(), 'Company_Enroll_YYYY-MM-DD.csv')
我想将它用作我可以从我的 c# 代码调用的查询的一部分,所以查询看起来像这样:
选择 ThisField, ... 从 mytable
这是可行的吗?
谢谢。
我有一个表,在其中一个字段中我存储了一个这样的字符串:
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;
编辑
这是处理多行场景的一种方法:
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 的调用可能比其余的查询更能杀死你。