当我将以下代码添加到我的报告存储过程中时,我无法将共享数据集添加到我的SSRS报告中,并且它给了我这个错误:
关键字'as'附近的语法不正确。
我添加的代码(以前的工作程序)是:
set @sqlstring = Concat(N'INSERT INTO #TEXT_SEARCH_RESULT',
N'(Result_Name,Count_of_tickets,HT,Created_Group)',
N' SELECT ',@TimeDefinition,' as RESULT_NAME',
N' ,sum(COUNT_OF_TICKETS) as COUNT_OF_TICKETS',
N' ,sum(HT) as HT',
N' ,''Group'' as CREATED_GROUP',
N' from #TEXT_SEARCH_MAIN ct',
N' where (1=1) ')
--other items that append to the string, but have no bearing on the question
set @sqlstring=concat(@sqlstring,N' group by ',@TimeDefinition)
sql语句将数据附加到临时表中,其中包含前一语句中已存在的数据
@TimeDefinition声明为NVARCHAR(100)
用变量中的文本替换@TimeDefinition(例如cast(CREATEDDATE as date
)允许添加报告
如果我从连接字符串中删除AS
,则错误只会更改为关键字'by'附近的语法不正确。
在SSMS中运行查询不会出错
答案 0 :(得分:0)
这里的问题是SSRS在没有提供参数的情况下无法确定查询的列。使用动态SQL时,如果没有为一个(或多个)参数提供值,动态SQL有时不会有值;因此,不能确定列值。举一个简单的例子:
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT ' + QUOTENAME(@Col1) + N' AS Result1,' + NCHAR(10) +
N' ' + QUOTENAME(@Col2) + N' AS Result2' + NCHAR(10) +
N'FROM MyTable;';
PRINT @SQL;
EXEC sp_executesql @SQL;
除非提供@Col1
和@Col2
的值,否则@SQL
的值将导致 NULL
。
使用这些查询时,SSRS会为您显示一个对话窗口。这看起来像下面的内容(取自SSDT 2017)
您需要在此对话框中输入一些值(在第二列中,名为Parameter Value
),以便SSRS可以正确地确定列定义。完成后,SSRS将正确创建数据集。
在相关说明中,我建议不要使用1=1
。这只会增加处理时间(因为数据引擎仍然需要检查是否1=1
)并且可能导致查询分析器做出糟糕的选择。实际上,在查询的WHERE
子句中加入类似的内容实际上可能被认为是非常糟糕的做法。