SQL Server 使用 EXECUTE 插入

问题描述 投票:0回答:2

我正在尝试使用

EXECUTE
语句将一些值插入到表中。

我发现了一些例子,但是,这些并不能回答我的问题。

注意: 下面给出的来源是过程中的代码。所有提到的变量都已声明并初始化。

我尝试的第一种方法:

INSERT INTO [master].[dbo].[table_1] (column1, column2)
EXEC sp_executesql @sql, N'@object id INT, @crlf CHAR(2)', @object_id, @crlf, 1

结果:

错误:过程或函数指定了太多参数。

我完全明白为什么我会得到这个。因为

sp_executesql
不允许有超过4个参数,并且它无法识别哪个到哪里。

第二次尝试(我只想使用execute语句将输出获取到变量中,然后将其放入表中):

DECLARE @sql_in nvarchar(max)
DECLARE @sql_out nvarchar(max)
SET @sql_in = @sql + ',' 
    + N'@object_id INT, @crlf CHAR(2),' 
    + CONVERT(varchar(100), @object_id) + ',' + @crlf
PRINT @sql_in
EXEC sp_executesql @sql_in, N'@sql_out nvarchar(max) out', @sql_out out

我得到:

必须声明标量变量“@crlf”

实际上这个变量是在这个过程的顶部声明的,但是这个对我来说不太清楚,为什么它仍然抱怨......

将执行语句和数字(附加值)放入表中的最充分方法是什么?

sql-server database sql-server-2012 sql-insert
2个回答
0
投票

作为唯一的解决方法,我建议使用临时表。应该很简单:

SELECT TOP (0) column1
INTO #TemporaryResults
FROM [master].[dbo].[table_1];

INSERT INTO #TemporaryResults
EXECUTE sp_executesql @sql, N'@object_id INT, @crlf CHAR(2)', @object_id, @crlf;

INSERT INTO [master].[dbo].[table_1] (column1, column2)
SELECT column1, 1
FROM #TemporaryResults;
  1. 从 [table_1] 列 1 创建列 1 的副本
  2. 将SP产生的记录插入其中
  3. 向实际表插入记录

0
投票

请按照以下示例尝试

DECLARE @IntVariable int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
DECLARE @max_title varchar(30);

SET @IntVariable = 197;
SET @SQLString = N'SELECT @max_titleOUT = max(JobTitle) 
   FROM AdventureWorks2012.HumanResources.Employee
   WHERE BusinessEntityID = @level';
SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';

EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;
SELECT @max_title;

观察

  1. SQL查询需要一个参数

    @level
    这就是为什么我们将其声明为参数

  2. SQL 查询再次返回 @max_titleOUT 处的输出。所以我们也将它声明为参数。所以最终的参数列表是

    SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';
    
  3. 现在我们必须将

    @level
    值发送到动态查询,这就是为什么我们使用
    @level = @IntVariable
    @IntVariable
    值发送到
    @level

  4. 最后通过

    @max_titleOUT = @max_title OUTPUT
    ,我们获取保存在
    @max_titleOUT
    的动态查询的输出,将值复制到
    @max_title

© www.soinside.com 2019 - 2024. All rights reserved.