【问题标题】:Set variables in stored procedure using EXECUTE sp_executesql使用 EXECUTE sp_executesql 在存储过程中设置变量
【发布时间】:2012-07-16 15:25:21
【问题描述】:

我正在尝试构建一个 SQL 字符串以通过 sp_executesql 执行,但我似乎无法为传入的 sql 字符串中的声明变量赋值。

下面是我的程序示例

ALTER PROCEDURE [dbo].[selectRecords]
@psID INT --parameter passed in
AS   
DECLARE @existingRecordCount INT=0

DECLARE @sql NVARCHAR(1000)
DECLARE @paramDefinitions NVARCHAR(1000)

SET @paramDefinitions=
    '@psID INT,    
    @existingRecordCount INT OUTPUT'

SET @sql='  
SELECT 
@existingRecordCount=COUNT(Name)
FROM dbo.Asset_Log
WHERE ID=@psID
GROUP BY Name'

EXECUTE sp_executesql @sql, @paramDefinitions, @psID, @existingRecordCount

所以,我希望我的记录计数在 @existingRecordCount 变量中,但我收到以下错误:

“OUPUT”附近的语法不正确。
必须声明标量变量“@existingRecordCount”。

我做错了什么?

提前致谢。我正在使用 SQL Server 2008

【问题讨论】:

  • OUTPUT 不是OUPUT。也像EXECUTE sp_executesql @sql, @paramDefinitions, @psID, @existingRecordCount OUTPUT一样调用并在外面声明@psID并为其分配要传入的值。
  • 你能解释一下为什么这需要动态 SQL 吗?
  • 马丁,谢谢。对不起错字。 Aaron,我刚刚修改了这篇文章的示例

标签: sql-server-2008 variables stored-procedures sp-executesql


【解决方案1】:

虽然这不需要是动态 SQL:

ALTER PROCEDURE [dbo].[selectRecords]
  @psID INT
AS
BEGIN
  SET NOCOUNT ON; 

  DECLARE @rc INT;

  SELECT @rc = COUNT(Name) 
    FROM dbo.Asset_Log
    WHERE ID = @psID;
END
GO

我假设这里还有其他你没有分享的逻辑,这使它成为必需品。如果是这样的话:

ALTER PROCEDURE [dbo].[selectRecords]
  @psID INT
AS
BEGIN
  SET NOCOUNT ON; 

  DECLARE 
    @rc     INT = 0,
    @sql    NVARCHAR(1000),
    @params NVARCHAR(1000);

  SET @params = N'@psID INT, @rc INT OUTPUT';

  SET @sql = N'SELECT @rc = COUNT(Name)
    FROM dbo.Asset_Log
    WHERE ID = @psID;';

  EXEC sp_executesql @sql, @params, @psID, @rc OUTPUT;
END
GO

我也看不出GROUP BY Name 的任何理由。您是否观察到如何将查询从单个结果更改为每个名称一行?

【讨论】:

  • 嗨亚伦。感谢你的回答。 group by 实际上是需要的,因为在完整的 SQL 中我还返回了其他列
【解决方案2】:

删除Dynamic Query 语法和Group By Clause

ALTER PROCEDURE [dbo].[selectRecords]
@psID INT --parameter passed in
AS       
SET NOCOUNT ON;
SELECT COUNT(Name) as existingRecordCount FROM dbo.Asset_Log WHERE ID=@psID

【讨论】:

    【解决方案3】:

    试试这个,它的工作原理

    CREATE PROCEDURE [dbo].[deleteItem]
        @ItemId int = 0,
        @status bit OUT
    
    AS
    Begin
       DECLARE @cnt int;
       SET @status =0;  --Set value to variable 
       return @status;
    End
    

    执行存储过程

    我们在执行存储过程时将 ItemId 传递为 6

    输出将收到“@statuss”变量

    DECLARE @statuss bit;
    EXECUTE  [dbo].[deleteItem] 6, @statuss output;
    PRINT @statuss;
    

    【讨论】:

      猜你喜欢
      • 2015-02-28
      • 2011-06-06
      • 2022-01-26
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      相关资源
      最近更新 更多