无法执行 SQL 服务器存储过程
Can not execute SQL Server stored procedure
我有以下过程,我向其中传递了一个字符串参数,例如 ,2,3,
。该过程应该 return 一组行,其中 CategoryId
等于 2
或 3
:
CREATE PROCEDURE [dbo].[GetItemListProcedure]
(@CategoriesIdString VARCHAR(1000))
AS
SET NOCOUNT ON;
DECLARE @SQLQuery NVARCHAR(MAX);
SET @SQLQuery = N'SELECT Item.Id, Item.ModelId, Item.ItemCode, Item.CategoryId,
(SELECT TOP (1) Category.CategoryName FROM Category WHERE Category.Id = Item.CategoryId) AS CategoryName
FROM Item
LEFT OUTER JOIN Category ON Item.CategoryId = Category.Id';
IF (@CategoriesIdString IS NOT NULL)
BEGIN
SET @SQLQuery += N' WHERE CHARINDEX('','' + CONVERT(VARCHAR(12), Item.CategoryId) + '','', '' + @CategoriesIdString + '') > 0';
END
DECLARE @ParmDefinition NVARCHAR(600);
SET @ParmDefinition = N'@categoriesId VARCHAR(1000);
PRINT @SQLQuery;
EXEC sp_executesql @SQLQuery, @ParmDefinition, @categoriesId = @CategoriesIdString
RETURN 0
这个程序,由于某种原因,return没有记录。
但是,如果我运行下面的查询:
DECLARE @CategoriesIdString VARCHAR(1000)
SET @CategoriesIdString = ',2,3,';
SELECT
Item.Id, Item.ModelId, Item.ItemCode, Item.CategoryId,
(SELECT TOP (1) Category.CategoryName
FROM Category
WHERE Category.Id = Item.CategoryId) AS CategoryName
FROM
Item
LEFT OUTER JOIN
Category ON Item.CategoryId = Category.Id
WHERE
CHARINDEX(',' + CONVERT(VARCHAR(12), Item.CategoryId) + ',', @CategoriesIdString) > 0
然后我得到了一些行。
我的存储过程哪里做错了?
我也这样试过:
SET @SQLQuery += N' WHERE CHARINDEX('','' + CONVERT(VARCHAR(12), Item.CategoryId) + '','', @CategoriesIdString) > 0';
但是报错:
{"Must declare the scalar variable \"@CategoriesIdString\"."}
在这种情况下,您不需要使用动态 T-SQL
语句。其中一种方法是使用这样的东西:
DECLARE @TempXML XML = CONVERT(XML, '<t>' + REPLACE(@CategoriesIdString, ',', '</t><t>') + '</t>')
;WITH DataSource ([CategoryId]) AS
(
SELECT T.c.value('.', 'VARCHAR(100)')
FROM @TempXML.nodes('/t') AS T(c)
WHERE LEN(T.c.value('.', 'VARCHAR(100)')) > 0
)
SELECT Item.Id
,Item.ModelId
,Item.ItemCode
,Item.CategoryId
,(SELECT TOP (1) Category.CategoryName FROM Category WHERE Category.Id = Item.CategoryId) AS CategoryName
FROM Item
LEFT OUTER JOIN Category
ON Item.CategoryId = Category.Id
LEFT JOIN DataSource
ON Item.CategoryId = DataSource.CategoryId
WHERE DataSource.CategoryId IS NOT NULL
OR @CategoriesIdString IS NULL
如果它是 NOT NULL
,则使用 LEFT JOIN
按 @CategoriesIdString
参数过滤。
我有以下过程,我向其中传递了一个字符串参数,例如 ,2,3,
。该过程应该 return 一组行,其中 CategoryId
等于 2
或 3
:
CREATE PROCEDURE [dbo].[GetItemListProcedure]
(@CategoriesIdString VARCHAR(1000))
AS
SET NOCOUNT ON;
DECLARE @SQLQuery NVARCHAR(MAX);
SET @SQLQuery = N'SELECT Item.Id, Item.ModelId, Item.ItemCode, Item.CategoryId,
(SELECT TOP (1) Category.CategoryName FROM Category WHERE Category.Id = Item.CategoryId) AS CategoryName
FROM Item
LEFT OUTER JOIN Category ON Item.CategoryId = Category.Id';
IF (@CategoriesIdString IS NOT NULL)
BEGIN
SET @SQLQuery += N' WHERE CHARINDEX('','' + CONVERT(VARCHAR(12), Item.CategoryId) + '','', '' + @CategoriesIdString + '') > 0';
END
DECLARE @ParmDefinition NVARCHAR(600);
SET @ParmDefinition = N'@categoriesId VARCHAR(1000);
PRINT @SQLQuery;
EXEC sp_executesql @SQLQuery, @ParmDefinition, @categoriesId = @CategoriesIdString
RETURN 0
这个程序,由于某种原因,return没有记录。
但是,如果我运行下面的查询:
DECLARE @CategoriesIdString VARCHAR(1000)
SET @CategoriesIdString = ',2,3,';
SELECT
Item.Id, Item.ModelId, Item.ItemCode, Item.CategoryId,
(SELECT TOP (1) Category.CategoryName
FROM Category
WHERE Category.Id = Item.CategoryId) AS CategoryName
FROM
Item
LEFT OUTER JOIN
Category ON Item.CategoryId = Category.Id
WHERE
CHARINDEX(',' + CONVERT(VARCHAR(12), Item.CategoryId) + ',', @CategoriesIdString) > 0
然后我得到了一些行。
我的存储过程哪里做错了?
我也这样试过:
SET @SQLQuery += N' WHERE CHARINDEX('','' + CONVERT(VARCHAR(12), Item.CategoryId) + '','', @CategoriesIdString) > 0';
但是报错:
{"Must declare the scalar variable \"@CategoriesIdString\"."}
在这种情况下,您不需要使用动态 T-SQL
语句。其中一种方法是使用这样的东西:
DECLARE @TempXML XML = CONVERT(XML, '<t>' + REPLACE(@CategoriesIdString, ',', '</t><t>') + '</t>')
;WITH DataSource ([CategoryId]) AS
(
SELECT T.c.value('.', 'VARCHAR(100)')
FROM @TempXML.nodes('/t') AS T(c)
WHERE LEN(T.c.value('.', 'VARCHAR(100)')) > 0
)
SELECT Item.Id
,Item.ModelId
,Item.ItemCode
,Item.CategoryId
,(SELECT TOP (1) Category.CategoryName FROM Category WHERE Category.Id = Item.CategoryId) AS CategoryName
FROM Item
LEFT OUTER JOIN Category
ON Item.CategoryId = Category.Id
LEFT JOIN DataSource
ON Item.CategoryId = DataSource.CategoryId
WHERE DataSource.CategoryId IS NOT NULL
OR @CategoriesIdString IS NULL
如果它是 NOT NULL
,则使用 LEFT JOIN
按 @CategoriesIdString
参数过滤。