我有一个SELECT
可以生成值列表的语句:
DECLARE @ValueList varchar(Max);
SELECT @ValueList = COALESCE(@ValueList + ',', '') + CAST(Val AS varchar(max))
FROM
(SELECT TOP (100) PERCENT tblSampleTable.SomeIDNumber AS Val
FROM tblSampleTable) AS ValuesThisYear
PRINT @ValList
这将返回一个包含类似值的列表
val1,val2,val4,val9,
等等,然后我可以输入存储过程,或以其他方式管理。
现在,我想让查询评估的值列表是动态的,可能传入或从另一个存储过程传入,类似于:
DECLARE @ValueList varchar(Max);
DECLARE @TSQL varchar(Max);
SET @TSQL = {stored proc to get base query}
SELECT @ValueList = COALESCE(@ValueList + ',', '') + CAST(Val AS varchar(max))
FROM
(@TSQL) AS ValuesThisYear
PRINT @ValList
我知道 include 的语法是错误的@TSQL
,这就是我想要找出的。我查看了许多线程并尝试了多种方法,但仍然无法合并这个动态部分。
棘手的部分似乎是列表(COALESCE
和CAST
语句)的制作,我将其中合并@ValList
为返回字符串的一部分。
任何帮助,将不胜感激!
动态 SQL 通常是关于
例如(尚未用于生产!)我添加了一个新变量 @CustomSQL
DECLARE @ValueList varchar(Max);
DECLARE @TSQL varchar(Max);
DECLARE @CustomSQL varchar(Max);
SET @TSQL = {stored proc to get base query}
SET @CustomSQL =
'SELECT COALESCE(@ValueList + '','', '''') + CAST(Val AS varchar(max))
FROM (
' + @TSQL + '
) As ValuesThisYear;'
PRINT @CustomSQL
EXEC (@CustomSQL)
请注意,添加文本/字符串(例如,@TSQL 变量)必须作为确切的字符串而不是它们的变量名称输入。还要注意撇号 - 每次要引用 '.
我还从 中删除了变量名,SELECT @ValueList = ...
因为动态 SQL 实际上不能引用变量 - 它有自己的范围(?记不起正确的词)并且无法访问变量。对此的解决方案包括
就个人而言,我会以不同的方式处理它 - 使用提供的 T-Sql 将数据放入临时表中。然后在另一个语句中使用临时表,例如,
DECLARE @ValueList varchar(Max);
DECLARE @TSQL varchar(Max);
SET @TSQL = {stored proc to get base query}
DECLARE @CustomSQL varchar(Max)
CREATE TABLE #temp (Val varchar(1000))
SET @CustomSQL = 'INSERT INTO #temp (Val) ' + @TSQL
EXEC (@CustomSQL)
SELECT @ValueList = COALESCE(@ValueList + ',', '') + CAST(Val AS varchar(max))
FROM #temp As ValuesThisYear;
PRINT @ValList
我几乎从来没有在第一次尝试时就得到正确的动态 SQL。建议
以下是我最近完成的以前帖子中的一些示例
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句