生锈的老程序员在这里返回...试图测试存储过程并遇到此错误消息。错误:
Msg 137,第15级,州2,第18行必须声明标量变量“ @DepartmentID”。
//测试调用代码:
DECLARE @SearchString varchar(30), @DispositionText varchar(200)
declare @DepartmentID uniqueidentifier;
SET @SearchString = 'T'
SET @DispositionText = '';
SET @DepartmentID = '00000000-0000-0000-0000-000000000000';
EXEC GetInventoryByAssetDescription @SearchString, @DispositionText, @DepartmentID
实际的存储过程代码(是的,我知道这是不好的代码,我最初不是写它的,但必须在很短的时间内对其进行修改):
USE [Inventory]
GO
/****** Object: StoredProcedure [dbo].[GetInventoryByAssetDescription] Script Date: 12/23/2019 9:09:51 AM ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[GetInventoryByAssetDescription]
(
@SearchString varchar(30),
@DispositionText varchar(200) = null,
@DepartmentID uniqueidentifier
)
AS
begin
SET NOCOUNT ON
declare @sql nvarchar (2000)
select @SearchString=UPPER(@SearchString)
set @sql = ' select in_eq_ID,
in_eq_TagNumber as TagNumber,
Title1Item,
in_eq_AssetDescription as Description,
in_eq_ExtendedDescription as ExtendedDescription,
in_eq_SerialNumber as SerialNumber,
in_eq_ValuationAmount as TotalValue,
in_eq_CustodianName as Name,
in_eq_ComplexBuilding as ShortLocation,
in_eq_SubLocationCode as ShortRoomNumber,
in_ca_Categories.in_ca_CategoryName as CategoryName,
in_eq_DispositionDate as DispositionDate,
Departments.DepartmentCode,
DATEADD (dd, 0, DATEDIFF (dd, 0, in_eq_Equipment.in_eq_AcquisitionDate)) as AcquisitionDate
from in_eq_Equipment, Departments
where in_eq_Equipment.DepartmentID = @DepartmentID
LEFT JOIN in_ca_Categories ON in_eq_Equipment.in_eq_CategoryID_fk = in_ca_Categories.in_ca_CategoryID
WHERE upper (in_eq_AssetDescription) LIKE upper ('''+ @SearchString + ''')
'
set @sql=@sql+' ' + ISNULL(@DispositionText,' ') + ' order by in_eq_AssetDescription'
execute (@sql)
return
end
where子句:
where in_eq_Equipment.DepartmentID = @DepartmentID
应该是:
where in_eq_Equipment.DepartmentID = '''+CAST(@DepartmentID AS nvarchar(36))+'''
P.S .:它看起来根本不需要动态SQL。同样,即使您需要,也应更改为使用带参数的sp_executesql。