【问题标题】:How do I create a schema in another DB如何在另一个数据库中创建模式
【发布时间】:2021-01-03 04:06:45
【问题描述】:

我正在尝试在我创建的新数据库中创建架构。

sql命令:

   exec('use ADD6_DATA; exec sp_executesql N''create schema 1M'' ')

但我得到这个错误:

“1”附近的语法不正确。

我从 c# 执行语句:

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();

            SqlCommand cmd = new SqlCommand(sqlCommand, conn);
            cmd.CommandTimeout = 600;
            cmd.ExecuteScalar();
        }

【问题讨论】:

    标签: c# sql-server schema


    【解决方案1】:

    以数字开头的对象名称​​必须进行分隔标识。这里也不需要“动态”声明。 USE 如果它也来自您的应用程序,则不应该存在,因为它(应用程序)应该连接到连接字符串中的适当数据库(ADD6_DATA)。所以你的陈述就变成了:

    CREATE SCHEMA [1M];
    

    因此,理想情况下,不要使用此架构名称,因为 所有 引用都需要对架构进行定界标识。 (通常)建议您使用不需要分隔标识的对象名称以避免上述错误。一些(较旧的)系统不会(正确)引用对象名称,这可能导致它们难以引用也需要分隔标识的对象。

    【讨论】:

    • 个人建议关注regular identifier naming rules。添加一个可以避免USE 声明:sqlCommand = "EXEC ADD6_DATA..sp_executesql N'create schema [1M]';";
    • True 替代 USE , @DanGuzman ,更多的是看起来 OP 正在从他们的 C# 应用程序运行上述内容,所以连接字符串 应该 是首先连接到正确的数据库;因此,在 SQL 语句中重新声明数据库实际上是多余的。加上他们随后将其放入 EXEC 和另一个 EXEC sys.sp_executesql 的事实是很奇怪的。
    • 我希望有关创建模式的文档有 1 个方括号示例!
    • @DanGuzman 所以 dbName..sp_executesql,意味着为 DBName 运行 sp_executesql 命令?好多了!
    • 不需要,@ManInMoon,因为对象的识别规则在 Guzman 链接的文档中。这些规则不仅仅适用于架构,它适用于 SQL Server 中的所有标识符。这可能是数据库、函数、表的名称,并包括别名等。
    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2019-04-25
    相关资源
    最近更新 更多