【问题标题】:How can I create a dynamic Select statement within a SQL Select statement?如何在 SQL Select 语句中创建动态 Select 语句?
【发布时间】:2021-01-28 07:18:38
【问题描述】:

我有一个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

我知道包含@TSQL 的语法是错误的,而这正是我想要找出的。我查看了许多线程并尝试了许多方法,但仍然无法合并此动态部分。

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

任何帮助将不胜感激!

【问题讨论】:

    标签: sql dynamic


    【解决方案1】:

    动态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 注释掉并改为打印。

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

    【讨论】:

    • 完美。在想我可以把 sql 的文本放在那里,但是临时表效果很好。
    • 太棒了!很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2013-10-10
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多