我正在尝试使用
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”
实际上这个变量是在这个过程的顶部声明的,但是这个对我来说不太清楚,为什么它仍然抱怨......
将执行语句和数字(附加值)放入表中的最充分方法是什么?
作为唯一的解决方法,我建议使用临时表。应该很简单:
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;
请按照以下示例尝试
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;
观察
SQL查询需要一个参数
@level
这就是为什么我们将其声明为参数SQL 查询再次返回 @max_titleOUT 处的输出。所以我们也将它声明为参数。所以最终的参数列表是
SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';
现在我们必须将
@level
值发送到动态查询,这就是为什么我们使用 @level = @IntVariable
将 @IntVariable
值发送到 @level
最后通过
@max_titleOUT = @max_title OUTPUT
,我们获取保存在@max_titleOUT
的动态查询的输出,将值复制到@max_title