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;