2013-10-09 44 views
-1

有人可以解釋爲什麼以下給我「必須聲明標量變量@設施。」但如果我使用VARCHAR而不是我創建的類型,可以正常工作嗎?我怎樣才能解決這個問題?必須聲明標量變量與表值參數和存儲過程

TIA

--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 statment串聯東西,構建語句所有作品必須是爲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