执行存储为字段值的SQL语句

时间:2013-11-28 11:40:04

标签: sql-server tsql

是否可以执行以文本形式存储在表中的SQL语句。

我正在尝试创建一个配置表来驱动大量的SSRS订阅,并且不希望将任何值直接编码到报表中,我希望它们都是从表中驱动来进行维护的。

E.G。

如果一个报告文件名的一部分将始终是上个月的年份(例如2013),但这需要在运行时生成。

我可以将其存储为文本字段

CAST(YEAR(DATEADD(month, -1, GETDATE())) AS VARCHAR(4))

然后执行它并将结果解析为SQL查询?

2 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,那么使用动态SQL是。例如:

DECLARE @SQL NVARCHAR(4000)
DECLARE @YEAR VARCHAR(4)
SET @SQL = 'SELECT @yr = CAST(YEAR(DATEADD(month, -1, GETDATE())) AS VARCHAR(4))'
EXECUTE sp_executesql @SQL, N'@yr VARCHAR(4) OUTPUT', @yr=@YEAR OUTPUT

SELECT @YEAR

...将2013年退回变量@YEAR。

这里我对查询进行了硬编码,但是从表的列值构建@SQL的值是一个简单的例子。然后,您可以使用此查询的结果来构建另一个动态查询,依此类推。

下面是上面的一个子集,显示了从表中取出的SQL:

CREATE TABLE Dynamic (id INTEGER, text VARCHAR(4000) )
INSERT Dynamic values (1, 'CAST(YEAR(DATEADD(month, -1, GETDATE())) AS VARCHAR(4))')

SET @SQL = 'SELECT @yr = ' + (SELECT text FROM Dynamic WHERE id =  1)

答案 1 :(得分:0)

为什么不能?

每个报告只有一行值吗?

我看到SSRS有2个选择。

1)sql中的一切,你做动态sql。

declare @sql nvarchar(4000) 
select @sql = 'select * from mytable where year = ' mavar'
from tablevalue  where uniqueid = blablabla
exec sp_executesql @sql

第二种可能性:

您在SSRS中创建第一个数据集获取此值,然后评估条件的值并将其发送到第三个数据集。

如果您有多个值,您仍然可以想象从第一个数据集中获取值,评估它们并将其发送到子报告。

我不知道你的应用程序应该确定它的性能。

在你使用SSRS之前,我建议尝试在SSRS而不是Sql中找到解决方案(但它根本不是黄金法则!)