1

ASP.NET 環境で C# でコーディングしています。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;
    }
}
4

2 に答える 2

3

SQL Server の内部 (システム) ストアド プロシージャと関数 ( sp_renamesp_helpOBJECT_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'

ただし、 の 2 番目のパラメーターとして指定した新しい名前はsp_rename解析されず、ストアド プロシージャは指定したとおりにオブジェクト名を設定することに注意てください。

sp_rename 'dbo.MyTable', '[dbo].NewTable'

MyTableこれはに変わり[dbo].NewTable、修飾されたテーブル名は正確にdbo.[dbo].NewTable! この名前でこの新しいテーブルにアクセスするのは少しトリッキーです:

sp_rename 'dbo."[dbo].NewTable"', 'OldTableName'

ただし、SQL Server システム テーブル ( sys.tablesys.columns、... など) のオブジェクト名にアクセスする場合は、区切り記号と修飾子を使用しないでください。これらのテーブルの識別子は文字列として格納されるためです。

select * from sys.columns where object_id = OBJECT_ID('dbo.Orders') and [name]='OrderID'

OBJECT_ID()システム関数であり、オブジェクト名を解析しますがOrderID、正確な列名 (大文字と小文字を区別しない) として指定する必要があります

于 2012-03-17T10:35:59.590 に答える
1

テーブルの名前変更に [dbo] を含めても問題ありません。例えば:

SQL Server のテーブル名が「dbo」で始まるのはなぜですか?

[dbo] を含めるかどうかに関係なく、名前変更コマンドは引き続き機能するはずです。

これはあなたの場合ですか?

于 2012-03-17T10:29:56.567 に答える