2015-12-11 5 views
0

Но использование Replace i изменило схему таблицы после из условия условия и объединения, но одно условие не выполнено.Sql Dynamic Query Заменить схему таблиц

Может ли один помочь мне

Пример:

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

этот запрос получить для базы данных на основе пользователя входа. У каждого пользователя есть другой запрос, который мы получаем. Мне нужно добавить схему таблицы в этот запрос. –

+0

хорошо, но ваш вопрос не описывается больше, как вы хотите. объясните больше, что вы хотите, вы также можете использовать переменную в функции замены. – Ajay2707

ответ

0

Лучший способ Функция

НАПИСАТЬ Функция TM.GetSplit ( @SqlTxt VARCHAR (макс) ) возвращает NVARCHAR (макс) в Начало Declare @txt NVARCHAR (Макс), @ originalTxt NVARCHAR (Макс), @ orgtxt NVARCHAR (макс), @ раздельным NVARCHAR (макс), @ старт междунар, @ конец междунар, @ 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

yes имя таблицы динамические изменения –