Как написать правильный синтаксис для переименования таблицы базы данных 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] или нет, команда переименования все равно должна работать.

Это так для тебя?

Другие вопросы по тегам