2013-05-20 38 views
6

Vấn đề của tôi là sử dụng một biến bảng trong một exec.sql động sử dụng biến bảng -TSQL

declare @sort_col nvarchar(1000) = 'itm_id' 
declare @sort_dir nvarchar(4) = 'desc' 
declare @filters nvarchar(1000) = ' and itm_name like ''%aa%''' 

declare @temp table 
(
itm_id int 
) 

insert into @temp 
EXEC('select itm_id from Tblitm where itm_name not like ''%aa%''') 

EXEC('select * from (select (ROW_NUMBER() OVER (ORDER BY '[email protected]_col+' '[email protected]_dir+')) row_num, * FROM (select itm_id, itm_name, 
dbo.fnItmsHistory(itm_id) itm_history 
     from dbo.Tblitm as itm 
     left outer join '[email protected]+' as temp on itm.itm_id = temp.itm_id 
     where itm_id=itm_id and temp.itm_id = null '[email protected]+') as x) as tmp') 

Nó nói Phải khai báo các biến vô hướng "@temp" khi bảng tạm thời bị tuyên bố tôi đã cố gắng sử dụng bảng tạm thời ban đầu và nó làm việc, nhưng tôi đã có vấn đề khi cố gắng cập nhật thực thể của tôi model.So có bất kỳ giải pháp cho vấn đề này?

Lưu ý: Tôi phải sử dụng lệnh exec vì trong bộ lọc, tôi lưu trữ chuỗi cho mệnh đề where.

+2

Sử dụng #temp thay vì @temp và chỉ tham chiếu #temp trực tiếp trong EXEC() thay vì xử lý nó như một tên biến. –

+0

Xem [Chèn động vào báo cáo bảng biến SQL Server] (http://stackoverflow.com/questions/5196434/dynamic-insert-into-variable-table-statement-sql-server) –

+0

@AaronBertrand i thực hiện truy vấn chức năng như rằng, nhưng tôi đã có vấn đề khi cập nhật mô hình thực thể của tôi vì vậy tôi sợ tôi không thể sử dụng sửa chữa. – Aleks

Trả lời

1

Thử di chuyển biến bảng bên trong câu lệnh động.

EXEC(' 
declare @temp table 
(
itm_id int 
) 
insert into @temp 
select itm_id from Tblitm where itm_name not like ''%aa%'' 
select * from (select (ROW_NUMBER() OVER (ORDER BY '[email protected]_col+' '[email protected]_dir+')) row_num, * FROM (select itm_id, itm_name, 
dbo.fnItmsHistory(itm_id) itm_history 
     from dbo.Tblitm as itm 
     left outer join @temp as temp on itm.itm_id = temp.itm_id 
     where itm_id=itm_id and temp.itm_id = null '[email protected]+') as x) as tmp') 
+0

Đây là giải pháp hoạt động, nhưng tôi không thể sử dụng giải pháp này làm chậm truy vấn đáng kể. – Aleks

+0

@Aleks Tại sao bạn cần một bảng tạm thời, tại sao không tham gia với truy vấn con 'chọn itm_id từ Tblitm, nơi itm_name không thích ''% aa% ''' trực tiếp thay thế? – Magnus

+0

truy vấn tôi đã viết là một ví dụ tôi có nhiều truy vấn phức tạp hơn và khi tôi đặt nó tất cả trong exec phải mất rất nhiều thời gian hơn bằng cách sử dụng một bảng tạm thời. – Aleks

Các vấn đề liên quan