SujataJK Ответов: 2

Как использовать динамическое имя базы данных в SQL-запросе


Привет,
Здесь у меня есть 2 базы данных, одна из которых-мой FARVISIONDB, а другая-JKUMARJV.У обоих один и тот же стол.Здесь используйте check Organization, то есть базу данных с переднего конца.Здесь я создал хранимую процедуру с datanm в качестве параметра.

Что я уже пробовал:

So my query inside stored procedure like 

<pre>DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX),@dbnm varchar(1000),@rslt varchar(max)

set @dbnm='farvisiondb'

set @cols = 'STUFF((SELECT distinct '','' + QUOTENAME(STATENAME) 
            from ((select CODE from '+@dbnm+'..M_STATEWISEGSTINACTAG)  e inner join
                 (select CODE,STATENAME from '+@dbnm+'..M_STATEMASTER)  f on e.code=f.code)  
                FOR XML PATH(''''), TYPE).value(''.'', ''NVARCHAR(MAX)'') ,1,1,'''')'

print @cols

EXEC sp_executesql @cols, N'@rslt varchar output',@rslt OUTPUT




Он отлично печатает запрос, то есть когда я передаю farvisiondb в качестве параметра, то он идеально подходит
STUFF((SELECT distinct ',' + QUOTENAME(STATENAME) 
                    from (                   
                      (select CODE from farvisiondb..M_STATEWISEGSTINACTAG)  e inner join
                      (select CODE,STATENAME from farvisiondb..M_STATEMASTER)  f on e.code=f.code
                         )  
                    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')


Но это не исключено.
Пожалуйста, помогите мне.Заранее спасибо.

BinnyVishwant

Работает ли это для jkumarjv db?

SujataJK

нет, я имею в виду в 1-м запросе .У меня есть команда print, поэтому ее результаты - мой второй запрос, который я показал выше.Это означает, что мой запрос выполняется до инструкции print, но когда я собираюсь выполнить @cols, то он показывает ошибку типа

Msg 156, Уровень 15, Состояние 1, Строка 6
Неправильный синтаксис рядом с ключевым словом "FOR".

BinnyVishwant

можете ли вы попробовать удалить onedot(.)i, e. farvisiondb..M_STATEWISEGSTINACTAG >
farvisiondb.M_STATEWISEGSTINACTAG

BinnyVishwant

Также попробуйте выполнить только выбрать полу сначала и проверить, действительно ли вы получаете необходимые результаты! указав свое имя базы данных вручную

SujataJK

да, я пытался .Работает, когда я предоставляю ручное имя базы данных

BinnyVishwant

попробуйте дать псевдонимное имя раньше для

") в качестве
ПО ПУТИ В XML("), ТИПА).значение('.', 'ТИП NVARCHAR(МАКС)') ,1,1,")"

SujataJK

Я тоже пробовал это, но это дает ту же ошибку.
Для дальнейшего оформления, пожалуйста, проверьте мою хранимую процедуру..

создайте процедуру [dbo].[GSTIN_Update]
АС
НАЧАТЬ

Объявите @cols как NVARCHAR(MAX),
@query AS NVARCHAR(MAX)

select @cols = STUFF ((SELECT distinct ',' + QUOTENAME(STATENAME)
от (
(выберите код из FARVISIONDB..M_STATEWISEGSTINACTAG) e внутреннее соединение
(выберите код, имя состояния из FARVISIONDB..M_STATEMASTER) f on e. code=f. code
)
ПО ПУТИ В XML("), ТИПА).значение('.', 'ТИП NVARCHAR(МАКС)') ,1,1,")
print @cols;

set @query = 'SELECT CtrlAc, DESCR,' + @cols + ' from
(выберите c. CtrlAc,a.DESCR,s.GSTIN, stcd.statename из
(выберите accd, descr, MAINACCD из FARVISIONDB..M_LEDGER) в качестве внутреннего соединения
(выберите код,Gstin,ОРКК из FARVISIONDB..M_STATEWISEGSTINACTAG), как и на.ОРКК = С. ОРКК внутреннее соединение
(Выберите код, имя состояния, UT из FARVISIONDB..M_STATEMASTER) как STCD на s. CODE=stcd.КОД ВНУТРЕННЕГО СОЕДИНЕНИЯ
(Выберите ACCD, DESCR как CtrlAc из FARVISIONDB..M_LEDGER) как C на c. ACCD=a.MAINACCD
) икс
стержень
(
МАКС(GSTIN)
для имени состояния в (' + @cols + ')
) п '
выполнение запроса)
PRINT @query;
КОНЕЦ;

Это моя статическая процедура, я просто хочу заменить FARVISIONDB параметром @dbnm.
здесь @Cols содержит имя состояния, которое я использовал в @query.
я.е @седла содержится

[Бихар], [ДАДРА и нагар ХАВЕЛИ], [Даман и ДИУ], [Дели], [Гоа], [Гуджарат], [Харьяна], [Джаркханд], [Карнатака], [Мадхья-Прадеш], [Махараштра], [Раджастхан], [Тамилнаду], [Телангана], [Уттар-Прадеш]

2 Ответов

Рейтинг:
15

Richard Deeming

Вы упускаете начальное SELECT Вы также можете упростить соединение, чтобы избежать вложенных запросов.

set @cols = N'SELECT STUFF((SELECT DISTINCT '','' + QUOTENAME(f.STATENAME) 
            FROM ' + QUOTENAME(@dbnm) + N'.dbo.M_STATEWISEGSTINACTAG As e INNER JOIN
                 ' + QUOTENAME(@dbnm) + N'.dbo.M_STATEMASTER As f ON e.code = f.code
            FOR XML PATH(''''), TYPE).value(''.'', ''NVARCHAR(MAX)''), 1, 1, '''')'


SujataJK

Да когда я это сделал
select @cols = STUFF ((SELECT distinct ',' + QUOTENAME(STATENAME)
от (
(выберите код из FARVISIONDB..M_STATEWISEGSTINACTAG) e внутреннее соединение
(выберите код, имя состояния из FARVISIONDB..M_STATEMASTER) f on e. code=f. code
)
ПО ПУТИ В XML("), ТИПА).значение('.', 'ТИП NVARCHAR(МАКС)') ,1,1,")
print @cols;
я не могу написать @dbnm (переменная) вместо FARVISIONDB .

Рейтинг:
0

CHill60

Вам нужно полностью квалифицировать таблицу в динамическом sql. Это должно быть в формате [database].[schema].[table]. Вам не хватает схемы. Е. Г.

'FROM ' + @dbnm + '.dbo.M_STATEWISEGSTINACTAG) as STCD'


Richard Deeming

По крайней мере, в MS SQL Server, если вы опустите схему, она будет использовать схему по умолчанию для текущего пользователя.

Это все еще хорошая идея, чтобы включить схему; но это не причина ошибки OP. :)

SujataJK

да Ричард вы правы