【问题标题】:Is it possible for me to use a variable in a CREATE TABLE statement?我可以在 CREATE TABLE 语句中使用变量吗?
【发布时间】:2014-12-27 06:56:45
【问题描述】:

我想做类似以下的事情......

declare @tableName as varchar(100)

set @tableName = 'MyNewTable'

CREATE TABLE @tableName
(
column1 int identity(1,1) PRIMARY KEY,
column2 varchar(50) not null,
column3 datetime
)

...在CREATE TABLE 语句中参数化表名;但是当我按原样运行时,我收到错误 '@tableName' 附近的语法不正确。

如何在CREATE TABLE 语句中使用变量?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2005 create-table


    【解决方案1】:

    为此,您应该使用动态 SQL:

    DECLARE @tableName AS VARCHAR(100),
            @sql       NVARCHAR(max)
    
    SET @tableName = 'MyNewTable'
    SET @sql ='CREATE TABLE ' + @tableName
              + ' ( column1 int identity(1,1) PRIMARY KEY, column2 varchar(50) not null, column3 datetime )'
    print @sql
    EXEC Sp_executesql
      @sql 
    

    【讨论】:

    • 可以使用动态SQL,但是否应该是另外一个问题,答案取决于具体情况。
    【解决方案2】:

    不用动态 SQL 也可以这样做:

    DECLARE @tableName as varchar(100)
    
    SET @tableName = 'MyNewTable'
    CREATE TABLE TestTemp ( column1 int identity(1,1) PRIMARY KEY, 
                            column2 varchar(50) not null, 
                            column3 datetime )
    EXEC sp_rename TestTemp , @tableName
    

    【讨论】:

    • 我真的很喜欢这种方式来完全避开动态 SQL。
    【解决方案3】:

    根据您的需要,您还可以使用SQLCMD variable 来参数化CREATE TABLE 语句中的表名 - 例如:

    :setvar tableName "MyNewTable"
    
    CREATE TABLE $(tableName)
    (
    column1 int identity(1,1) PRIMARY KEY,
    column2 varchar(50) not null,
    column3 datetime
    )
    

    这种方法的潜在好处(取决于您的情况)是能够使用sqlcmd 命令行参数指定表名 - 即sqlcmd.exe [...] -v tableName="MyNewTable"(在这种情况下,您可以注释掉脚本中的 :setvar 命令 - 因为命令行 arg 将声明并初始化预期的 tableName SQLCMD 变量。

    【讨论】: