Установите переменные в хранимой процедуре, используя EXECUTE sp_executesql

Я пытаюсь создать строку SQL для выполнения через sp_executesql, но я не могу присвоить значение объявленной переменной в переданной строке 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


person Sun    schedule 16.07.2012    source источник
comment
OUTPUT не OUPUT. Также вызовите как EXECUTE sp_executesql @sql, @paramDefinitions, @psID, @existingRecordCount OUTPUT и объявите @psID снаружи и назначьте ему значение, которое будет передано.   -  person Martin Smith    schedule 16.07.2012
comment
Можете ли вы объяснить, почему это должен быть динамический SQL?   -  person Aaron Bertrand    schedule 16.07.2012
comment
Мартин, спасибо. Извините за опечатку. Аарон, я только что изменил пример для этого поста.   -  person Sun    schedule 16.07.2012


Ответы (3)


Хотя это не обязательно должен быть динамический 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. Вы заметили, как это меняет запрос с одного результата на строку на имя?

person Aaron Bertrand    schedule 16.07.2012
comment
Привет, Аарон. Спасибо за ответ. Группа на самом деле необходима, так как в полном SQL у меня возвращаются другие столбцы - person Sun; 17.07.2012

Удалить синтаксис 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
person Community    schedule 16.07.2012

Попробуйте, это работает

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;
person Dinesh Vaitage    schedule 17.02.2016