【问题标题】:Create temp table from dynamic SQL with parameters使用参数从动态 SQL 创建临时表
【发布时间】:2022-01-07 03:14:39
【问题描述】:

这是我的问题。我需要在执行动态 SQL 并传递参数后创建一个临时表,如下所示

CREATE PROCEDURE SP1
    @param1 varchar(50),
    @param2 varchar(50)
AS
BEGIN
    DECLARE @PDef varchar(300)
    DECLARE @sql  varchar(300)
    DECLARE @localparam1 varchar(300)
    DECLARE @localparam2 varchar(300)

    SET @localparam1 = ....
    SET @localparam2 = ....
 
    SET @PDef = '@param1 varchar(50), @localparam1 varchar(300)'

    SET @sql = 'SELECT * FROM TABL1 WHERE COL1 = @param1, COL2 in (@localparam1)'
 
    EXEC sp_Executesql @sql, @PDef, 
                            @param1 = @param1, @localparam1 = @localparam1

以上工作。如何将结果放入临时表?

我试过了

CREATE TABLE #T1 (col1 varchar(50), col2 varchar(50) )

INSERT INTO #T1 
    EXECUTE @sql    -- didn't work    

INSERT INTO #T1 
    EXECUTE (@sql, @PDef, @param1 = @param1, @localparam1 = @localparam1)   -- didn't work either

编辑:在使用 EXECUTE 时查看了以下示例 Dynamic SQL results into temp table in SQL Stored procedure 并因此使用了 EXECUTE 接受的答案是: 插入 #T1 执行 ('execute' + @SQLString ) 如果 sql 字符串不是过程,则省略 'execute'

现在查看接受答案的问题的 cmets :-)

【问题讨论】:

  • 您从 EXEC 声明中删除了 sp_Executesql。由于印刷错误投票结束。
  • 使用 sp_Executesql 不起作用。
  • 不过,你为什么要在这里使用动态 SQL?你的陈述没有任何动态。 COL2 in (@localparam1) 也不太可能与您认为的有关;相当于COL2 = @localparam1
  • insert into #T1 execute sys.sp_Executesql @sql 没用? “没用”是什么意思?你收到错误了吗?出乎意料的结果?还有什么?
  • 使用时出错-插入#T1执行sys.sp_Executesql @SQL 它正在寻找参数-“必须声明标量变量..”

标签: sql-server dynamic-sql temp-tables


【解决方案1】:

由于某种原因,您已从查询中删除了 sp_executesql。如果你不告诉 SQL Server,你就不能调用sys.sp_executesql

INSERT INTO #T1
EXECUTE sys.sp_executesql @sql;

INSERT INTO #T1
EXECUTE sys.sp_executesql @sql,
                          @PDef,
                          @param1 = @param1,
                          @localparam1 = @localparam1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多