C# 如何编写正确的语法从C代码重命名SQL Server数据库表?
我正在ASP.NET环境中用C编写代码,我需要编写一个函数,该函数接受SQL Server数据库表并给它起另一个名称 因此,从SQL的角度来看,我需要这样做:C# 如何编写正确的语法从C代码重命名SQL Server数据库表?,c#,asp.net,sql,sql-server,sp-rename,C#,Asp.net,Sql,Sql Server,Sp Rename,我正在ASP.NET环境中用C编写代码,我需要编写一个函数,该函数接受SQL Server数据库表并给它起另一个名称 因此,从SQL的角度来看,我需要这样做: EXEC sp_rename 'OldTableName', 'NewTableName'; 但问题是,有时提供给函数的旧表名可能是这样的:[dbo].[OldTableName],就我所知,括号“[”和“]”不是名称本身的一部分,也不是dbo部分 那么如何处理这种情况呢 编辑:我能够用C代码删除括号,但需要检查: for (int i
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;
}
}
在重命名表时包含[dbo]这一事实应该无关紧要。例如: 无论是否包含[dbo],rename命令都应该仍然有效
您就是这样吗?在重命名表时包含[dbo]这一事实应该无关紧要。例如: 无论是否包含[dbo],rename命令都应该仍然有效
您是这样吗?当使用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_重命名的第二个参数的新名称将不会被解析,存储过程将完全按照您指定的方式设置对象名称:
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应指定为不区分大小写的确切列名。使用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_重命名的第二个参数的新名称将不会被解析,存储过程将完全按照您指定的方式设置对象名称:
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应该指定为不区分大小写的确切列名。非常好。非常感谢。但有一个问题。使用您的方法是否可以安全地假设[或]不能是名称本身的一部分?不,它们可以是名称的一部分。但这些名称应该用分隔符分隔。您可以将表命名为My table],但在访问它时,应使用[My table]]。名称周围的[和]是分隔符,右括号中的[和]用于转义第二个右括号!谢谢你纠正它。所以说了[and],这使得你上面的C不正确-它只会删除[or]的所有实例,对吗?事实上,对:但在标识符名称中使用这些字符[,]是非常罕见的,最好避免。如果我们能想出一些C代码以正确的方式删除它们,那将非常有帮助。我在想一些regexp之类的东西。有什么想法吗?很好。非常感谢。但有一个问题。使用您的方法是否可以安全地假设[或]不能是名称本身的一部分?不,它们可以是名称的一部分。但这些名称应该用分隔符分隔。您可以将表命名为My table],但在访问它时,应使用[My table]]。名称周围的[和]是分隔符,右括号中的[和]用于转义第二个右括号!谢谢你纠正它。所以说了[and]之后,上面的C就不正确了——它只会删除[or]的所有实例,对吗?事实上,对:但是在标识符名称中使用这些字符[,]是非常罕见的,最好是
无效。如果我们能想出一些C代码以正确的方式删除它们,那将非常有帮助。我在想一些regexp之类的东西。有什么想法吗?