如何在 SQL Select 语句中创建动态 Select 语句?

飞利浦

我有一个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,这就是我想要找出的。我查看了许多线程并尝试了多种方法,但仍然无法合并这个动态部分。

棘手的部分似乎是列表(COALESCECAST语句)的制作,我将其中合并@ValList为返回字符串的一部分。

任何帮助,将不胜感激!

肖恩

动态 SQL 通常是关于

  • 创建包含要运行的确切 SQL 的变量
  • 然后使用 EXEC (@SQLvariable) 运行该代码

例如(尚未用于生产!)我添加了一个新变量 @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 实际上不能引用变量 - 它有自己的范围(?记不起正确的词)并且无法访问变量。对此的解决方案包括

  • 使用临时表例如,#TEMP它可以被引用
  • 使用 OUTPUT 子句

就个人而言,我会以不同的方式处理它 - 使用提供的 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。建议

  • 尽可能简单
  • 在运行某个版本之前(例如,EXEC (@CustomSQL)),将 EXEC 注释掉并打印它。

以下是我最近完成的以前帖子中的一些示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章