下面的语句将返回你所有的产品在CSV参数类别规定:
DECLARE @Products TABLE
(
[ProductID] INT
,[ProductName] NVARCHAR(32)
)
DECLARE @Categories TABLE
(
[CategoryID] INT
,[CategotyName] NVARCHAR(32)
)
DECLARE @ProductCategory TABLE
(
[ProductID] INT
,[CategoryID] INT
)
INSERT INTO @Products ([ProductID], [ProductName])
VALUES (1, 'Product 1')
,(2, 'Product 2')
,(3, 'Product 3')
,(4, 'Product 4')
INSERT INTO @Categories ([CategoryID], [CategotyName])
VALUES (1, 'Category 1')
,(2, 'Category 2')
,(3, 'Category 3')
INSERT INTO @ProductCategory ([ProductID], [CategoryID])
VALUES (1, 1)
,(1, 2)
,(1, 3)
,(2, 1)
,(2, 2)
,(3, 1)
,(4, 2)
,(4, 3)
DECLARE @CategoriesCSV NVARCHAR(MAX) = '1,2'
DECLARE @CategoriesXML XML = N'<r><![CDATA[' + REPLACE(@CategoriesCSV, ',', ']]></r><r><![CDATA[') + ']]></r>'
;WITH DataSource AS
(
SELECT DISTINCT CAST(Tbl.Col.value('.', 'float') AS BIGINT) AS [CategoryID]
FROM @CategoriesXML.nodes('//r') Tbl(Col)
WHERE ISNUMERIC(Tbl.Col.value('.', 'varchar(max)')) = 1
)
SELECT C.[CategoryID]
,C.[CategotyName]
,P.[ProductID]
,P.[ProductName]
FROM @Categories C
INNER JOIN DataSource DS
ON C.[CategoryID] = DS.[CategoryID]
INNER JOIN @ProductCategory PC
ON C.[CategoryID] = PC.[CategoryID]
INNER JOIN @Products P
ON PC.[ProductID] = P.[ProductID]
从上面的查询结果是:
就是 “CategoryIds” CSV参数? – gotqn
您的查询似乎很简单。您应该包含更多信息。像什么是@categoryId,它是如何定义的。你使用的是哪个版本的sql server,你的表格是如何定义的 –
包括测试数据和预期结果也可能是一个想法,以防止我们猜测并浪费时间在错误的答案上 –