Как написать правильный синтаксис для переименования таблицы базы данных SQL Server из кода C#?
Я пишу на C# в среде ASP.NET, и мне нужно написать функцию, которая берет таблицу базы данных SQL Server и дает ей другое имя.
Так что с точки зрения SQL мне нужно сделать это:
EXEC sp_rename 'OldTableName', 'NewTableName';
Но проблема в том, что иногда (старое) имя таблицы, предоставленное моей функции, может выглядеть примерно так: [dbo].[OldTableName] и, насколько я понимаю, скобки ('[' и ']') не являются часть самого имени, а также часть "dbo".
Так как справиться с такой ситуацией?
РЕДАКТИРОВАТЬ: я смог придумать код C# для удаления скобок (необходимо проверить, хотя):
for (int i = 0; i < strTableName.Length; i++)
{
if (strTableName[i] == '[' ||
strTableName[i] == ']')
{
int j = i;
for (; j < strTableName.Length && strTableName[j] == strTableName[i]; j++) ;
int nRepeatCnt = j - i;
int nNumKeep = nRepeatCnt / 2;
int nNumRemove = nRepeatCnt - nNumKeep;
strTableName = strTableName.Remove(i, nNumRemove);
i += nNumKeep - 1;
}
}
2 ответа
При использовании внутренних (системных) хранимых процедур и функций SQL Server (sp_rename
, sp_help
, OBJECT_ID
,...), нет необходимости удалять или добавлять разделители и квалификаторы ('[' и ']' или имя схемы по умолчанию, например, 'dbo'), потому что эти функции анализируют имена идентификаторов и выводят фактическое имя. Также существуют ситуации, когда вам необходимо использовать разделители (когда они не являются обычными идентификаторами. См. Идентификаторы).
Например при переименовании dbo.MyTable
в dbo.NewTable
, все эти команды действительны:
sp_rename 'dbo.MyTable', 'NewTable'
sp_rename '[dbo].MyTable', 'NewTable'
sp_rename 'MyTable', 'NewTable'
sp_rename '[dbo].[MyTable]', 'NewTable'
Но обратите внимание, что новое имя, которое вы указываете в качестве второго параметра sp_rename
не будет проанализирован, и хранимая процедура установит имя объекта в точности так, как вы указали:
sp_rename 'dbo.MyTable', '[dbo].NewTable'
Это изменения MyTable
в [dbo].NewTable
и ваше точное имя таблицы точно dbo.[dbo].NewTable
! Доступ к этой новой таблице с таким именем немного сложен:
sp_rename 'dbo."[dbo].NewTable"', 'OldTableName'
Но при доступе к именам объектов в системных таблицах SQL Server (например, sys.table
, sys.columns
,...), вы не должны использовать разделители и квалификаторы, потому что идентификаторы в этих таблицах хранятся как строки символов:
select * from sys.columns where object_id = OBJECT_ID('dbo.Orders') and [name]='OrderID'
OBJECT_ID()
является системной функцией и анализирует имя объекта, но OrderID
должно быть указано как точное имя столбца (без учета регистра).
Тот факт, что вы включили [dbo] в переименование таблицы, не должен иметь значения. Например:
Почему имена таблиц в SQL Server начинаются с "dbo"?
Включаете ли вы [dbo] или нет, команда переименования все равно должна работать.
Это так для тебя?