Как передать имя столбца как переменную в динамическом запросе в SQL Server? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть запрос ниже, который дает количество различных значений для каждого столбца.Но мне нужно добавить условие запроса where в запрос, например column1 = 'abc'.Я использую этот общий запрос, чтобы можно было использовать тот же запрос с другими таблицами, также передав имя таблицы.

DECLARE @query VARCHAR(MAX)

SELECT @query = 
    'SELECT ' + SUBSTRING((SELECT ',' +'COUNT(DISTINCT(' + column_name + ')) AS ' + column_name + ' '  
     FROM information_schema.columns
     WHERE table_name = 'table_name'
     FOR XML PAT('')), 2, 100000) + 'FROM table_name'

--PRINT(@query)
EXECUTE(@query)

Я попытался передать его, как показано ниже.

WHERE 
    table_name = 'table_name' 
    AND column1 = 'abc'     -- compilation error, obviously

WHERE 
    table_name = 'table_name' 
    AND 'column1' = 'abc'   -- not working, because it will compare the string values column1 and abc. and both are not equal

ЗатемЯ только что попробовал следующий запрос, но он также не работает, он генерирует неверный запрос при попытке печати. ​​

DECLARE @SQL NVARCHAR(MAX), @tname NVARCHAR(100), 
        @cname NVARCHAR(100), @acc_num NVARCHAR(50), @dp_code NVARCHAR(100)

SET  @cname = 'column_name';
SET @acc_num = 'xyz';
SET @tname = 'table_name';

DECLARE @query VARCHAR(MAX);

SET @SQL = ''
        ;with cols as (
        select Table_Schema, Table_Name, Column_Name, Row_Number() over(partition by Table_Schema, Table_Name
        order by ORDINAL_POSITION) as RowNum
        from INFORMATION_SCHEMA.COLUMNS
        )


SELECT @query = 
    'SELECT ' + SUBSTRING((SELECT ',' +'COUNT(DISTINCT(' + QUOTENAME(column_name, '') + ')) As ' + QUOTENAME(column_name, '')+ ' '
    + ' WHERE ' + 'column_name' + ' = ''' + @acc_num + ''''  
             FROM cols
             WHERE 
             table_name = @tname
             for xml path('')),2,200000)  +  'FROM' @tname
        --for xml path(''); 

PRINT @query
--execute (@query)

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Это должно быть то, что вы после. В SQL есть несколько комментариев, на которые нужно обратить внимание:

DECLARE @SQL nvarchar(max),
        @tname sysname, --note the datatype change
        @cname sysname, --note the datatype change
        @acc_num nvarchar(50),
        @dp_code nvarchar(100); --This is never used in your sample query
SET  @cname = 'column_name';
SET @acc_num = 'xyz';
SET @tname = 'table_name';


SET @SQL = N'SELECT ' + NCHAR(13) + NCHAR(10) +
             STUFF((SELECT N',' + NCHAR(13) + NCHAR(10) +
                           N'       ' + N'COUNT DISTINCT(' + QUOTENAME(C.Column_Name) + N') AS ' + QUOTENAME(C.Column_Name)
                    FROM INFORMATION_SCHEMA.COLUMNS C
                    WHERE C.Table_Name = @tname
                    ORDER BY C.ORDINAL_POSITION
                    FOR XML PATH(N'')),1,10,N'') + NCHAR(13) + NCHAR(10) +
             N'FROM ' + QUOTENAME(@tname) + NCHAR(13) + NCHAR(10) +
             N'WHERE ' + QUOTENAME(@cname) + N' = @Acc_Num;'

PRINT @SQL; --YOur debugging best friend
EXEC sp_executesql @SQL, N'@Acc_Num varchar(100)',@Acc_Num = @acc_num;

Этот параметр вместо этого параметризировал запрос, используя sp_executesql, и хорошо форматировал его для вашего PRINT оператора.

Если вы не понимаете, тогда , пожалуйста, спросите .

0 голосов
/ 02 апреля 2019

Если вы хотите, чтобы предложение WHERE в динамическом запросе, то вы должны поместить его после предложения FROM в динамическом запросе.

 ...
 for xml path('')),2,200000)  +  ' FROM '+ @tname
 + ' WHERE ' + 'column_name' + ' = ''' + @acc_num + ''''  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...