Как вставить переменную varchar в динамический запрос SQL - PullRequest
1 голос
/ 20 сентября 2019

У меня есть запрос с оператором select в цикле, и в то же время я хочу вставить переменную varchar и выбранное значение во временную таблицу, но я получаю сообщение об ошибке:

Сообщение 207, Уровень 16, Состояние 1, Строка 2
Недопустимое имя столбца 'SP419001_SID'

Это SP419001_SID - значение, содержащееся в переменной varchar @dbName.

Это мой запрос:

CREATE TABLE #tempCounter 
(
    dbName1 varchar(max), 
    counterNumber1 int
)

DECLARE
    @counter INT = 1,
    @max     INT = 0,
    @dbName  VARCHAR(100),
    @count   INT = 0,
    @SQLTEXT VARCHAR(MAX),
    @counterNumber VARCHAR(10)

SELECT @max = COUNT(id) FROM #tempPnamePadd

WHILE @counter <= @max
BEGIN
    SET @dbName='';

    -- Do whatever you want with each row in your table variable filtering by the Id column
    SELECT @dbName = name 
    FROM #tempPnamePadd
    WHERE Id = @counter

    PRINT @dbName

    SET @SQLTEXT    =
    --SELECT distinct PN.NAME_FORMAT_CODE, NAME_BUSINESS, INDIVIDUAL_FIRST, A.ADDRESS_ID, A.ADDR_LINE_1, A.ADDR_LINE_2, A.ADDR_LINE_3, A.CITY, A.STATE
    'DECLARE @dbn VARCHAR(200)
    SET @dbn ='+ @dbName +';
    INSERT INTO #tempCounter 
    (dbname1, counternumber1)
    SELECT @dbn ,
         (SELECT  count(*)
                                FROM '+ @dbName +'.dbo.PRELA PR  
                            INNER JOIN '+ @dbName +'.dbo.PNAME PN  
                            ON PR.NAME_ID = PN.NAME_ID  
                            INNER JOIN '+ @dbName +'.dbo.PNALK NK  
                            ON PN.NAME_ID = NK.NAME_ID  
                            INNER JOIN '+ @dbName +'.dbo.PADDR A  
                            ON NK.ADDRESS_ID = A.ADDRESS_ID  
                            WHERE (NAME_FORMAT_CODE=''B'' and NAME_BUSINESS like ''%BN'') OR
                            (NAME_FORMAT_CODE <> ''B'' and INDIVIDUAL_FIRST = ''John'') OR
                            (ADDR_LINE_1=''WELLS STREET'' AND CITY=''HOLLYWOOD'' AND STATE=''IA'')

                            )
                            '

    --PRINT @SQLTEXT
    EXEC  (@SQLTEXT)

    SET @counter = @counter + 1
END

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Это очень вероятно не самый эффективный способ сделать это;Скорее всего, вы должны использовать STRING_AGG или FOR XML PATH и STUFF для этого.

В любом случае вам необходимо параметризовать вашу переменную и заключить в кавычки ваши динамические объекты.Это приводит к следующему:

CREATE TABLE #tempCounter (dbName1 sysname,
                           counterNumber1 int);

DECLARE @counter int = 1,
        @max int = 0,
        @dbName sysname,
        @count int = 0,
        @SQLTEXT nvarchar(MAX),
        @counterNumber varchar(10);

SELECT @max = COUNT(id)
FROM #tempPnamePadd;

WHILE @counter <= @max
BEGIN
    SET @dbName = '';

    -- Do whatever you want with each row in your table variable filtering by the Id column
    SELECT @dbName = name
    FROM #tempPnamePadd
    WHERE Id = @counter;

    PRINT @dbName;

    SET @SQLTEXT = N'INSERT INTO #tempCounter 
    (dbname1, counternumber1)
    SELECT @dbn ,
         (SELECT  count(*)
                                FROM ' + QUOTENAME(@dbName) + N'.dbo.PRELA PR  
                            INNER JOIN ' + QUOTENAME(@dbName) + N'.dbo.PNAME PN  
                            ON PR.NAME_ID = PN.NAME_ID  
                            INNER JOIN ' + QUOTENAME(@dbName) + N'.dbo.PNALK NK  
                            ON PN.NAME_ID = NK.NAME_ID  
                            INNER JOIN ' + QUOTENAME(@dbName) + N'.dbo.PADDR A  
                            ON NK.ADDRESS_ID = A.ADDRESS_ID  
                            WHERE (NAME_FORMAT_CODE=''B'' and NAME_BUSINESS like ''%BN'') OR
                            (NAME_FORMAT_CODE <> ''B'' and INDIVIDUAL_FIRST = ''John'') OR
                            (ADDR_LINE_1=''WELLS STREET'' AND CITY=''HOLLYWOOD'' AND STATE=''IA'')

                            )
                            ';

    --PRINT @SQLTEXT
    EXEC sp_executesql @SQLTEXT, N'@dbn sysname', @dbn = @dbName;

    SET @counter = @counter + 1;
END;

Примечание. Я также изменил некоторые типы данных.

0 голосов
/ 20 сентября 2019

Вы не указали около @dbName в своем динамическом запросе.Таким образом, вместо

 SET @dbn ='SP419001_SID';

вы получите

 SET @dbn =SP419001_SID;

Do

    'DECLARE @dbn VARCHAR(200)
    SET @dbn ='''+ @dbName +''';
    INSERT INTO #tempCounter 
    ...'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...