Синтаксис Prob: Использование переменных в хранимых процедурах - PullRequest
1 голос
/ 19 января 2009

Может кто-нибудь сказать, как исправить следующий код ниже. Я пытаюсь создать хранимую процедуру, которая возвращает количество строк в таблице, имя которой передается ей.

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

AS

DECLARE @strQuery nvarchar(300)

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

EXEC(@strQuery)

RETURN @rowCountVal

СООБЩЕНИЕ ОБ ОШИБКЕ:

  • Неверный синтаксис рядом с @rowCountVal
  • Должен объявлять скалярную переменную '@tablename'
  • Необходимо объявить скалярную переменную '@ rowCountVal'

тогда как код ниже работает нормально

ALTER PROCEDURE spROWCOUNTER
(
    @rowCountVal int OUTPUT
)

AS

SELECT @rowCountVal=COUNT(*) FROM DEFECT_LOG

RETURN @rowCountVal

Ответы [ 6 ]

3 голосов
/ 19 января 2009
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 голос
/ 19 января 2009

если вы хотите, чтобы количество строк было функцией, вы также можете проверить Ускорение производительности подсчета таблиц в SQL Server 2005

Предоставленная в статье функция, по-видимому, быстрее, чем счетчик вызовов (*) для очень больших таблиц.

1 голос
/ 19 января 2009

В операторе выполнения вы можете использовать временную таблицу для обмена данными:

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
1 голос
/ 19 января 2009

Я бы использовал 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 '+@tablename

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


RETURN @rowCountVal
1 голос
/ 19 января 2009

Синтаксическая проблема легко решается. Между вашими параметрами есть пропущенная запятая (","). Вставьте запятую и хранимая процедура скомпилирует:

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

Затем возникает основная проблема : вы не можете получить доступ к параметру @rowCountVal внутри инструкции EXEC. Чтобы решить эту проблему, вы можете использовать встроенную хранимую процедуру sp_executesql.

Прочитайте эту хорошую статью, написанную MVP SQL Server Эрландом Соммарскогом .

Кстати: вам не нужно «возвращать» переменную. Возвращаемые значения обычно используются для возврата некоторых значений состояния. Если вы передадите выходной параметр, он будет автоматически возвращен.

0 голосов
/ 19 января 2009

да, я пропустил запятую. Но даже после этого значение не сохраняется в @rowCountVal.

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

EXEC(@strQuery)

запрос не возвращает и не отображает никакого значения.


Кстати, я думал о вызове этого процесса из других хранимых процедур для получения rowcounts Будет ли работать следующее утверждение:

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