#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