Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写正确的语法从C代码重命名SQL Server数据库表?_C#_Asp.net_Sql_Sql Server_Sp Rename - Fatal编程技术网

C# 如何编写正确的语法从C代码重命名SQL Server数据库表?

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

我正在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;
    }
}

在重命名表时包含[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之类的东西。有什么想法吗?