0

実行する 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 を使用しています

4

3 に答える 3

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。クエリが単一の結果から名前ごとの行にどのように変化するかを観察しましたか?

于 2012-07-16T15:39:36.273 に答える
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 ID=@psID
于 2012-07-16T15:40:45.430 に答える
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

ストアプロシージャの実行

ストアド プロシージャの実行時に ItemId を 6 として渡します

出力は「@statuss」変数で受け取ります

DECLARE @statuss bit;
EXECUTE  [dbo].[deleteItem] 6, @statuss output;
PRINT @statuss;
于 2016-02-17T12:05:16.713 に答える