2013-05-20 25 views
6

Sorunum bir yürütmede bir tablo değişkeni kullanıyor. Geçici tablo i orijinal geçici tablo kullanılarak çalışılmıştır bildirildi ve işe yaradı, ama benim varlık model.So güncellemeye çalışırken ben sorunları vardıTablo değişkenini kullanarak dinamik sql -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') 

Öyle skaler değişken "@temp" ilan Must orada herhangi diyor Bu sorun için çözüm?

Not: Yürütücüyü kullanmalıyım çünkü süzgeçlerde, hangi yan tümce dizesini saklıyorum.

+2

#temp yerine #temp kullanın ve sadece bir değişken adı gibi davranmak yerine EXEC() öğesinde #temp referansını kullanın. –

+0

Bkz. [Dinamik tablo ifadesi SQL Server'a ekleme] (http://stackoverflow.com/questions/5196434/dynamic-insert-into-variable-table-statement-sql-server) –

+0

@AaronBertrand Sorguyu işlevsel hale getirdim Bu, ama benim modelimi güncellerken sorunları vardı, bu yüzden bu düzeltmeyi kullanamayacağından korkuyorum. – Aleks

cevap

1

Tablo değişkenini dinamik deyimin içine taşımayı deneyin.

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

Bu, çalışan bir çözümdür, ancak bunu bir çözüm olarak kullanamıyorum, sorguyu önemli ölçüde yavaşlatır. – Aleks

+0

@Aleks Niçin temp tablosuna ihtiyacınız var, niçin alt-sorguya katılmıyorsunuz 'itm_d ''% aa% ''' yerine 'itm_name' yerine 'itm_id' i seçin. – Magnus

+0

yazdığım sorgu, çok daha karmaşık bir sorguya sahip olduğum bir örnektir ve hepsini exec içine koyduğumda, geçici bir tablo kullanmaktan çok daha fazla zaman alır. – Aleks

İlgili konular