我正在尝试构建一个通过sp_executesql
执行的SQL字符串,但我似乎无法为传入的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
答案 0 :(得分: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
的任何理由。您是否观察过如何将查询从单个结果更改为每个名称的行?
答案 1 :(得分: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
答案 2 :(得分: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;