No necesita usar T-SQL
dinámico declaración en este caso. Una de las formas es usar algo como esto:
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
La idea es filtrar por @CategoriesIdString
parámetro si es NOT NULL
usando LEFT JOIN
.