2015-12-11 79 views
0

但是使用替換我在之後從條件和聯接條件更改了表模式,但是一種情況失敗。Sql動態查詢替換表模式

可以在任何一個可以幫助我

例子:

Declare @Var Nvarchar(Max) 

    Set @Var='sampleid in (SELECT t1.id from EmployeesView t1 join Emp t2 t1.id=t2.id WHERE t1.l5 IN (SELECT t2.id from org t2, 
    org t3,org t4 WHERE t2.l >= t3.f AND t2.l <= t3.r AND t3.id = ''40'') AND t1.lstnm = ''kc'')' 


Select Replace(Replace(Convert(Varchar(Max),@Var),'from ','from AB.'),'join ','join AB.') 

O/P:

sampleid in (SELECT t1.id from AB.EmployeesView t1 join AB.Emp t2 t1.id=t2.id WHERE t1.l5 IN (SELECT t2.id from AB.org t2, 
org t3,org t4 WHERE t2.l >= t3.f AND t2.l <= t3.r AND t3.id = '40') AND t1.lstnm = 'kc') 

但預計O/P:

sampleid in (SELECT t1.id from AB.EmployeesView t1 join AB.Emp t2 t1.id=t2.id WHERE t1.l5 IN (SELECT t2.id from AB.org t2, 
TM.org t3,TM.org t4 WHERE t2.l >= t3.f AND t2.l <= t3.r AND t3.id = '40') AND t1.lstnm = 'kc') 
+0

根據你的que,@nguyen的輸出是對的,動態的含義是什麼意思呢?你在哪裏卡住,解釋更多。 – Ajay2707

+0

此查詢基於登錄用戶獲取數據庫。每個用戶都有不同的查詢。我需要在該查詢中添加Table Schema。 –

+0

好的,但你的問題沒有描述更多,因爲你想。更多地解釋你想要什麼,你也可以在替換函數中使用變量。 – Ajay2707

回答

0

最好的辦法是功能

創建函數TM.GetSplit ( @SqlTxt VARCHAR(最大) )返回爲nvarchar(最大) 作爲 開始 申報@txt nvarchar(Max),@ originalTxt nvarchar(Max),@ orgtxt nvarchar(max),@ split nvarchar(max),@ start int,@ end int,@ len int

Select @originalTxt = @SqlTxt, @[email protected] 

Set @len=LEN(@orgtxt) 

While @len > 0 
    Begin  
     Set @len=LEN(@orgtxt) 
     Select @start=CHARINDEX('from',@orgtxt) 
     Select @end=CHARINDEX('where',@orgtxt) 


     If(@start != 0 and @end!=0) 
      Begin 
       set @split = Substring(@orgtxt, @start, @[email protected]) 

       Set @orgtxt = SUBSTRING(@orgtxt,@end + 5 ,@[email protected]) 

       Set @[email protected] 

       Select @split=Replace(Replace(Replace(Convert(Varchar(Max),@split),'from ','from AB.'),'join ','join AB.') ,',',', AB.') 

       Select @originalTxt=REPLACE(@originalTxt,@txt,@split) 

       Set @[email protected] 
      End 
     Else 
      Begin 
       break 
      End 
    End 

    If @txt is null 
     Begin 
      Select @txt=Replace(Replace(Convert(Varchar(Max),@originalTxt),'from ','from AB.'),'join ','join AB.') 
     End 

return @txt 

結束

2

試試這個:

Select Replace(Replace(Replace(Replace(Convert(Varchar(Max),@Var),'from ','from AB.'),'join ','join AB.'), 'org', 'TM.org'), 'AB.TM', 'AB') 
+0

表名是動態來的,我需要動態的 –

+0

我覺得nguyen的查詢會給你預期的輸出。你的意思是你必須將表名稱作爲動態變量嗎? – bmsqldev

+0

是表名是動態變化 –