使用EXECUTE sp_executesql在存储过程中设置变量

时间:2012-07-16 15:25:22

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

我正在尝试构建一个通过sp_executesql执行的SQL字符串,但我似乎无法为传入的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

3 个答案:

答案 0 :(得分:5)

虽然这不需要是动态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的任何理由。您是否观察过如何将查询从单个结果更改为每个名称的行?

答案 1 :(得分:1)

删除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

答案 2 :(得分:0)

试试这个,它的工作

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;