Необходимо назначить имя столбца через переменную SQL

#sql #sql-server #tsql #dynamic-sql

#sql #sql-server #tsql #динамический-sql

Вопрос:

То, что я пытаюсь здесь сделать, это создать динамический запрос, в котором администраторам баз данных нужно только изменить имя столбца на уровне переменной. причина этого в том, что у нас есть несколько ужасно созданных баз данных, и, хотя они имеют одинаковые данные, имена столбцов меняются с одного на другое (есть ошибканет нормализации между ними).

Я работаю над запросом, в котором около 400 строк, и чего я пытаюсь избежать, так это передать логику другому администратору базы данных, где они должны пройти через скрипт и заменить все имена столбцов… но вместо этого просто назначьте имя столбца, которое соответствует логике из их базы данных. Не уверен, что это возможно.

Это пример:

 Declare @ColumnA 
Declare @ColumnB
set @ColumnA = 'UserID'
set @ColumnB = 'Salary'

select @ColumnA,@ColumnB from Table
  

Как я могу добиться такой функциональности?

Комментарии:

1. Это невозможно без динамического SQL, и я бы не рекомендовал преобразовывать запрос из 400 строк в динамический SQL. Ctrl H было бы намного проще tbh.

2. Интересно, как вы ожидаете, что ‘userId’ будет сохранен в int переменной. 😀

3. ха-ха, вы правы, я просто пытался донести мысль, но мне нужен запрос только для просмотра имени столбца, а не данных..

4. @Andrew: Нет причин, по которым идентификатор пользователя не может быть int .

5. @ Mitch, Эндрю был прав, я удаляю тип данных, потому что мне нужно сохранить имя столбца, а не тип данных .. это то, что я пытаюсь выяснить, возможно ли это на самом деле

Ответ №1:

Вы можете использовать динамический SQL таким образом:

 DECLARE @ColumnA nvarchar(max),
        @ColumnB nvarchar(max),
        @table nvarchar(max)
        @sql nvarchar(max)

SELECT  @ColumnA = N'UserID',
        @ColumnB = N'Salary',
        @table = N'Table'

SELECT @sql = N'SELECT '  QUOTENAME(@ColumnA) ',' QUOTENAME(@ColumnB)  ' FROM ' QUOTENAME(@table)  ';'

EXEC sp_executesql @sql
  

В таких ситуациях рекомендуется использовать QUOTENAME, это избавит вас от инъекций или пробелов внутри имен столбцов.

QUOTENAME — возвращает строку в Юникоде с добавленными разделителями, чтобы сделать входную строку допустимым идентификатором с разделителями SQL Server. Возврат nvarchar(258) . Так UserID стало [UserID] .

Ответ №2:

Я сделал динамический запрос. Вы можете присвоить переменным имена столбцов и таблиц.

             Declare @ColumnA  Varchar(50)
            Declare @ColumnB Varchar(50)
            Declare @tablename Varchar(50)

            set @ColumnA = 'UserID'
            set @ColumnB = 'Salary'
            set @tablename = '#table'

            declare @Query nvarchar(max)

            set @Query='select ' @ColumnA ',' @ColumnB '
                    FROM ' @tablename ' (NOLOCK)'

            -- print @Query  -- to see desired query.

            execute SP_executesql  @Query 
  

Пожалуйста, сообщите нам, если у вас есть какие-либо проблемы.

Ответ №3:

Вам просто нужна одна переменная и передайте необходимые столбцы через запятую. Затем используйте приведенный ниже динамический сценарий для получения ожидаемого результата.

 DECLARE @Columns nvarchar(max),
        @sql nvarchar(max)

SELECT  @Columns = N'UserID,Salary'

SELECT @sql = N'SELECT '  @Columns  ' FROM YourTable'

EXEC sp_executesql @sql