Как написать правильный синтаксис для переименования таблицы базы данных SQL Server из кода C #? - PullRequest
1 голос
/ 17 марта 2012

Я пишу на 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 ]

3 голосов
/ 17 марта 2012

При использовании внутренних (системных) хранимых процедур и функций SQL Server (sp_rename, sp_help, OBJECT_ID, ...) нет необходимости удалять или добавлять разделители и квалификаторы ('[' and '] 'или имя схемы по умолчанию (например,' 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 следуетуказывать в качестве точного имени столбца (регистр без учета ).

1 голос
/ 17 марта 2012

Тот факт, что вы включили [dbo] в переименование таблицы, не должен иметь значения.Например:

Почему имена таблиц в SQL Server начинаются с "dbo"?

Независимо от того, используете ли вы [dbo] или нет, команда переименования должна работать.

Так ли это для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...