【问题标题】:T-SQL Create Table with Dynamically Named Database with sp_executesqlT-SQL 使用 sp_executesql 创建具有动态命名数据库的表
【发布时间】:2016-12-14 20:46:51
【问题描述】:

我正在尝试使用 sp_executesql 在 T-SQL 中创建一个表。包含表的数据库名称是动态的。

DECLARE @ID int = 1031460
DECLARE @TableName nvarchar(max) = '[MyDatabase' + CAST(@ID as nvarchar(10)) + '].[dbo].[MyTable]'

DECLARE @CreateTable nvarchar(max) = N''
SELECT @CreateTable = 
N'
CREATE TABLE @TableName
(
    ID int
)
'

EXECUTE sp_executeSQL @CreateTable, N'@TableName nvarchar(max)', @TableName = @TableName

此脚本导致此错误:

消息 102,第 15 级,状态 1,第 2 行
“@TableName”附近的语法不正确。

根据sp_executeSQL的参数指定要动态创建的表名的最佳方法是什么?

【问题讨论】:

    标签: sql sql-server tsql create-table sp-executesql


    【解决方案1】:

    即使我们使用sp_executesql 过程,您也不能将表名作为参数传递。您必须构建自己的动态 sql 查询

    SELECT @CreateTable = 
    N'
    CREATE TABLE ' + @TableName + '
    (
    ID int
    )
    '
    Exec sp_executesql @CreateTable
    

    【讨论】:

    【解决方案2】:

    当您将表名作为参数传递给 sp_executesql 时,它会将其视为文字字符串,要使其将其视为对象名称,请尝试类似这样......

    DECLARE @ID int = 1031460
    DECLARE @TableName nvarchar(max) = QUOTENAME('MyDatabase' + CAST(@ID as nvarchar(10))) 
                                       + '.[dbo].[MyTable]'
    
    DECLARE @CreateTable nvarchar(max);
    
    SET @CreateTable = N' CREATE TABLE ' + @TableName
                     + N' (
                            ID int
                          )'
    
    Exec sp_executesql @CreateTable
    

    编辑

    在尝试创建对象之前检查对象是否已存在是一种很好的做法。

    您可以检查对象是否已经存在并删除它然后创建新对象,您的代码应该类似于.....

    DECLARE @ID int = 1031460
    DECLARE @TableName nvarchar(max) = QUOTENAME('MyDatabase' + CAST(@ID as nvarchar(10))) 
                                       + '.[dbo].[MyTable]'
    
    DECLARE @CreateTable nvarchar(max), @DropTable nvarchar(max);
    
    
    -- Drop table if already exists 
    SET @DropTable = N' IF OBJECT_ID('''+ @TableName +''') IS NOT NULL '
                   + N' DROP TABLE ' + @TableName
    
    Exec sp_executesql @DropTable 
    
    SET @CreateTable = N' CREATE TABLE ' + @TableName
                     + N' (
                            ID int
                          )'
    
    Exec sp_executesql @CreateTable
    

    【讨论】:

      猜你喜欢
      • 2020-07-05
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      相关资源
      最近更新 更多