0

我试图通过sp_executesql构建一个SQL字符串来执行,但我似乎无法将值分配给传入的sql字符串中的已声明变量。使用EXECUTE在存储过程中设置变量sp_executesql

所以下面是我的程序的一个例子

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 [email protected] 
GROUP BY Name' 

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

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

Incorrect syntax near 'OUPUT'.
Must declare the scalar variable "@existingRecordCount".

上午什么我做错了?

在此先感谢。我使用的是SQL Server 2008中

+2

'OUTPUT'不'OUPUT'。也可以像调用'EXECUTE sp_executesql @sql,@paramDefinitions,@psID,@existingRecordCount OUTPUT'并声明外部'@ psID'并为其分配值。 – 2012-07-16 15:26:32

+0

您能否解释为什么需要动态SQL? – 2012-07-16 15:35:35

+0

马丁,谢谢。抱歉关于错字。亚伦,我刚刚修改了这个帖子的例子 – Sun 2012-07-16 15:36:40

回答

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的原因。您是否观察过如何将查询从单个结果更改为每个名称的行?

+0

嗨亚伦。感谢你的回答。实际上,由于需要完整的SQL,所以我需要返回其他列 – Sun 2012-07-17 07:16:09

+1

@ user1131657请显示完整的代码。 – 2012-07-17 17:39:48

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 [email protected] 
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 

执行存储过程

我们逝去的项目Id为6时执行的时间存储过程

出认沽将收到 “@statuss” 变量

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