1

任何人都可以告訴下面的代碼有多正確。 Iam試着創建一個存儲過程,該過程返回一個表名的傳遞給它的行數。語法問題:在存儲過程中使用變量

CREATE PROCEDURE spROWCOUNTER 
(
    @tablename nvarchar(20) 
    @rowCountVal int OUTPUT 
) 

AS 

DECLARE @strQuery nvarchar(300) 

SET @strQuery = 'SELECT @rowCountVal=COUNT(*) FROM '[email protected] 

EXEC(@strQuery) 

RETURN @rowCountVal 

錯誤消息:

  • 附近有語法錯誤@rowCountVal「
  • 必須聲明標量變量 '@tablename'
  • 必須聲明標量變量 '@rowCountVal'

而下面的代碼正常工作

ALTER PROCEDURE spROWCOUNTER 
(
    @rowCountVal int OUTPUT 
) 

AS 

SELECT @rowCountVal=COUNT(*) FROM DEFECT_LOG 

RETURN @rowCountVal 

回答

3
CREATE PROCEDURE spROWCOUNTER 
    @tablename nvarchar(20),  
    @rowCountVal int OUTPUT 
AS 

SELECT @rowCountVal = ISNULL(SUM(spart.rows), 0) 
FROM sys.partitions spart 
WHERE spart.object_id = object_id(@tablename) AND spart.index_id < 2 

RETURN @rowCountVal 
1

語法問題很容易解決。在您的參數之間有一個缺失逗號(「,」)。插入逗號和存儲過程編譯:

(@tablename nvarchar(20), @rowCountVal int OUTPUT) 

然後,有主要問題:你不能訪問EXEC語句內@rowCountVal參數。要解決此問題,可以使用內置存儲過程sp_executesql

閱讀本文good article written by the SQL Server MVP Erland Sommarskog

順便說一句:你不必「返回」一個變量。返回值通常用於返回一些狀態值。如果你傳遞一個輸出參數,它會自動返回。

0

是的,我錯過了逗號。但即使在此之後,該值也不會存儲在@rowCountVal中。

SET @strQuery = 'SELECT @rowCountVal=COUNT(*) *FROM '+ @tablename 

EXEC(@strQuery) 

查詢不返回也不顯示任何值。


順便說一句,我想打電話從其他存儲,過程這個PROC得到rowcounts的。 將以下語句工作:

set @rCount = exec spROWCOUNTER('DEFECT_LOG') 
1

我會使用sp_executesql來替代EXEC。然後,您可以將@rowCountVal作爲輸出變量傳入動態sql。

create PROCEDURE spROWCOUNTER 
(
    @tablename nvarchar(20), 
    @rowCountVal int OUTPUT 
) 

AS 

DECLARE @strQuery nvarchar(300) 

SET @strQuery = 'SELECT @rowCountVal = COUNT(*) FROM '[email protected] 

exec sp_executesql @strQuery, N'@tablename nvarchar(20), @rowCountVal int OUTPUT', @tablename = @tablename, @rowCountVal = @rowCountVal output 


RETURN @rowCountVal 
1

在執行語句中,可以使用臨時表來共享數據:

CREATE PROCEDURE spROWCOUNTER 
    @tablename nvarchar(20),  
    @rowCountVal int OUTPUT 
AS 

CREATE TABLE #Result(Rows INT) 
EXEC('INSERT INTO #Result(Rows) SELECT COUNT(*) FROM ' + @tablename) 

SELECT @rowCountVal = Rows FROM #Result 

RETURN @rowCountVal