2011-11-03 12 views
5

Tôi cần trợ giúp chuyển tham số "loại bảng do người dùng xác định" sang sql động, sp_executesql.Truyền tham số bảng do người dùng định nghĩa tới sql động, sp_executesql

Dưới đây là mẫu mã của tôi:

DECLARE @str as nvarchar(Max) 
DECLARE @IDLIST AS ListBigintType /* this is my table type, with ItemId column (bigint)*/ 

INSERT INTO @IDLIST 

SELECT DISTINCT bigintid FROM tableWithBigInts WITH(NOLOCK) 


set @str ='select * from SomeTable where ID in (select ItemId from @IdTable) ' 

EXEC sp_executesql @str , @ParamDefs, @IdTable = @IDLIST 

Nó nói: Phải khai báo biến bảng "@IdTable"

tôi không thể có được điều này để làm việc, và không thể có được một cách giải quyết với liên hiệp (cho bigints) hoặc vì kết quả sẽ có hơn 8000 ký tự.

Trả lời

7

Hãy thử thiết @ParamDefs tới:

EXEC sp_executesql @str , N'@IdTable ListBigintType readonly', @IdTable = @IDLIST 

Dưới đây là một ví dụ đầy đủ làm việc:

create type ListBigintType as table (ItemId bigint) 
go 
declare @t as ListBigintType 
insert @t select 6*7 

exec sp_executesql 
    N'select ItemId from @IdTable', 
    N'@IdTable ListBigintType readonly', @t 
+0

Tôi xin lỗi, tôi quên viết rằng khi tôi đang viết những câu hỏi ở đây. Truy vấn đã có nó. nhưng nó cho cùng một lỗi. –

+0

Đã thêm ví dụ làm việc. Kiểm tra mức độ tương thích cho cơ sở dữ liệu của bạn, từ 'select name, compatibility_level từ sys.databases'? Nó sẽ được đặt thành 90 hoặc cao hơn, cho SQL Server 2005+. – Andomar

+0

Ví dụ tôi đã đăng chạy tốt trên cài đặt của tôi, vì vậy tôi chắc chắn rằng bạn có thể chuyển các tham số có giá trị bảng bằng cách sử dụng 'sp_executesql' – Andomar