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_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应指定为确切的列名称(不区分大小写)。

于 2012-03-17T10:35:59.590 回答
1

在重命名表时包含 [dbo] 的事实应该无关紧要。例如:

为什么 SQL Server 中的表名以“dbo”开头?

无论您是否包含 [dbo],rename 命令都应该仍然有效。

这是你的情况吗?

于 2012-03-17T10:29:56.567 回答