SQL Server - переименовать столбец в хранимой процедуре с разными базами данных
Я искал и искал и не могу решить, как решить мою проблему. Я на самом деле не уверен, что это возможно, но думал, что я опубликую здесь и проверю.
Проблема:
У меня есть хранимая процедура, в которой я делаю следующий вызов (их 2, потому что я пробовал разные вещи, но оба не удалось):
SET @olddate = '1606'
SET @newdate = '1706'
SET @TableName = 'sometablename'
SET @sql = 'SP_RENAME ''[DBName' + @olddate + '.dbo.' + @TableName + @olddate +'].[ColumnName' + @olddate + 'restofname]'',''[ColumnName' + @newdate + 'restofname]'''
EXECUTE sp_executesql @sql
Другой вариант:
SET @olddate = '1606'
SET @newdate = '1706'
SET @TableName = 'sometablename'
SET @old = '[DBName' + @olddate + '.dbo.' + @TableName + @olddate+']."[ColumnName' + @olddate + 'restofname]"'
SET @new = 'ColumnName' + @newdate + 'restofname'
EXECUTE sp_rename @objname = @old,@newname = @new, @objtype = 'COLUMN'
Я сохранил это в хранимой процедуре, а затем запустил в другом запросе, который имеет другой контекст базы данных и получил следующую ошибку для первого:
Никакой элемент с именем '[DBName.dbo.TableName.ColumnName]' не может быть найден в текущей базе данных [[Other database]', учитывая, что @itemtype был введен как'(null)'.
и это для второго:
Либо параметр @objname является неоднозначным, либо заявленный @objtype (COLUMN) неверен.
Теперь я задаюсь вопросом: могу ли я это сделать? написать хранимую процедуру, которая выполняет sp_rename в таблице в одной базе данных, а затем вызвать эту хранимую процедуру из другой базы данных?
Я также попробовал каждую перестановку, заключив открытые и закрытые скобки, [и] вокруг частей моих старых и новых имен столбцов. Также попытался поставить N перед строкой. Это немного проб и ошибок, хотя и до сих пор ничего не сработало.
3 ответа
Спасибо за помощь. Я на самом деле выяснил проблему впоследствии. Я знаю, что квадратные скобки были неправильными, но это не было проблемой (поскольку я пробовал все виды различных комбинаций квадратных скобок, и ни одна из них не работала).
set @old = @TableName +'.[ColumnName' + @olddate + 'restofname]'
set @new = 'ColumnName' + @newdate + 'restofname'
execute ('use DBName exec sp_rename ''' + @old + ''', ''' + @new + ''', ''COLUMN''')
Хитрость заключалась в том, чтобы включить "Использовать базу данных" в оператор выполнения.
Вы не можете поместить свои DBName и schemaName и имя таблицы в одну скобку [ ]. Вам нужно заключить каждую в скобку. И не используйте квадратные скобки вокруг вашего нового имени, так как они будут заключены в имя. Это строка, так что вы можете просто поставить пробелы и то, что вам нравится в ваше имя.
declare @TableName nvarchar(max)
declare @ColumName nvarchar(max)
declare @NewColumn nvarchar(max)
declare @sql nvarchar(max)
SET @NewColumn = 'newtest'
SET @ColumName = 'test'
SET @TableName = 'trassor'
SET @sql = 'SP_RENAME ''[YOURDBNAME].[YOURSCHEMANAME].['+ @TableName +'].['+@ColumName+']'', '''+@NewColumn+''', ''COLUMN'''
/* SET @sql = 'SP_RENAME ''[LegogSpass].[dbo].['+ @TableName +'].['+@ColumName+']'', '''+@NewColumn+''', ''COLUMN''' */
PRINT @SQL
EXECUTE sp_executesql @sql
Прежде всего, используйте запрос select @sql перед оператором sp_executesql, чтобы посмотреть, как был сформирован динамический оператор.
Это дает вам понимание ошибки.
В вашем случае скобки были размещены неправильно. Либо удалите их, либо добавьте по отдельности в имя базы данных, имя схемы, имя таблицы и столбец.
Кроме того, вам не хватало столбца в конце оператора sp_rename.
declare @sql nvarchar(max),@olddate varchar(10),@newdate varchar(10),@TableName varchar(100)
SET @olddate = '1606'
SET @newdate = '1706'
SET @TableName = 'sometablename'
SET @sql = 'SP_RENAME ''DBName' + @olddate + '.dbo.' + @TableName + @olddate +'.ColumnName' + @olddate + 'restofname'',''ColumnName' + @newdate + 'restofname'',''Column'''
select @sql
EXECUTE sp_executesql @sql