2013-10-09 2 views
-1

Может ли кто-нибудь объяснить, почему следующее дает мне «Должен объявить скалярную переменную @facilities». но отлично работает, если я буду использовать VARCHAR вместо моего созданного типа? Как я могу это исправить?Должен объявить скалярную переменную с табличными параметрами и хранимой процедурой

ТИА

--CREATE TYPE integer_list AS TABLE (n int NOT NULL PRIMARY KEY) 

--DROP PROCEDURE spTestTVP 

CREATE PROCEDURE spTestTVP (
    @facilities integer_list READONLY 
    [email protected] varchar(100) 
) 
AS 
    DECLARE @sql nvarchar(4000) 

    SET @sql = 'SELECT * FROM TestTable' 

    SET @sql = @sql + ' WHERE 1=1 ' 

    IF @facilities IS NOT NULL 
     SET @sql = @sql + ' AND (FacilityNo IN (' + @facilities + ') OR FacilityNo IS NULL)' 


    EXEC sp_executesql @sql 

ответ

1

Когда вы конкатенации вещи в dynamicSQl даного все части, которые строят заявление должно быть VARCHAR или NVARCHAR. Это предел SQL.

С другой стороны, вам не нужен динамический sql, так как вы создали таблицу.

SELECT * FROM TestTable t 
LEFT join @facilities f on f.n = t.facilityNO 
1
DECLARE @items VARCHAR(MAX) 
[email protected] = COALESCE(@items+',' ,'') + n 
FROM @facilities 

DECLARE @sql nvarchar(4000) 

    SET @sql = 'SELECT * FROM TestTable' 

    SET @sql = @sql + ' WHERE 1=1 ' 

    IF @facilities IS NOT NULL 
     SET @sql = @sql + ' AND (FacilityNo IN (' + @items + ') OR FacilityNo IS NULL)' 


    EXEC sp_executesql @sql 

или нет динамической следующим образом:

SELECT t.* FROM TestTable as t 
left outer join 
@facilities as f 
on 
f.n = t.FacilityNo 
where 
t.FacilityNo is null 
or 
f.n is not null 
Смежные вопросы