使用EXECUTE sp_executesql在存储过程中设置变量

Sun*_*Sun 0 variables stored-procedures sql-server-2008 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
Run Code Online (Sandbox Code Playgroud)

所以,我希望我的记录计数在@existingRecordCount变量中,但是我收到以下错误:

'OUPUT'附近的语法不正确.
必须声明标量变量"@existingRecordCount".

我究竟做错了什么?

提前致谢.我正在使用SQL Server 2008

Aar*_*and 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
Run Code Online (Sandbox Code Playgroud)

我假设这里有其他逻辑,你没有分享,这使它成为必需品.如果是这种情况:

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
Run Code Online (Sandbox Code Playgroud)

我也没有看到任何理由GROUP BY Name.您是否观察过如何将查询从单个结果更改为每个名称的行?