是否可以执行以文本形式存储在表中的SQL语句。
我正在尝试创建一个配置表来驱动大量的SSRS订阅,并且不希望将任何值直接编码到报表中,我希望它们都是从表中驱动来进行维护的。
E.G。
如果一个报告文件名的一部分将始终是上个月的年份(例如2013),但这需要在运行时生成。
我可以将其存储为文本字段
CAST(YEAR(DATEADD(month, -1, GETDATE())) AS VARCHAR(4))
然后执行它并将结果解析为SQL查询?
答案 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中找到解决方案(但它根本不是黄金法则!)