【问题标题】:Why I can't create a table with this dynamic SQL?为什么我不能用这个动态 SQL 创建表?
【发布时间】:2016-04-04 01:44:59
【问题描述】:

我有一个程序:

ALTER PROCEDURE SP_CREATETABLE
(
    @newTableName NVARCHAR(200)
)
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX)
    SELECT @sql = 'create table @tableName (id int identity(1,1) primary key )'
    PRINT @sql
    EXEC sp_executesql @sql, N'@tableName nvarchar(200)', @newTableName
END

当我尝试执行此操作时:

EXEC SP_CREATETABLE 'NEWTABLENAME';

我收到此错误:

消息 102,第 15 级,状态 1,第 12 行
'@tableName' 附近的语法不正确。

【问题讨论】:

标签: sql sql-server stored-procedures dynamic-sql


【解决方案1】:

你需要这样的东西:

ALTER PROCEDURE SP_CREATETABLE
(
    @newTableName NVARCHAR(200)
)
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX)
    SELECT @sql = 'create table ' + QUOTENAME(@newTableName) + ' (id int identity(1,1) primary key )'
    PRINT @sql
    EXEC sp_executesql @sql
END

EXEC SP_CREATETABLE 'NEWTABLENAME';

【讨论】:

  • @Prdp 如何防止这种情况发生:EXEC SAIR_CREATETABLE 'NEWTABLENAME (); drop table NEWTABLENAME';
  • QUOTENAME 函数应该可以缓解这种情况。
【解决方案2】:

您无法创建表的原因是因为参数仅适用于查询中的值,不适用于表名或列名。

我经常使用REPLACE()

ALTER PROCEDURE SP_CREATETABLE (
    @newTableName NVARCHAR(200)
)
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX);
    SELECT @sql = 'create table @tableName (id int identity(1,1) primary key )';
    SELECT @sql = REPLACE(@sql, '@tableName', @newTableName);
    PRINT @sql;
    EXEC sp_executesql @sql;
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    相关资源
    最近更新 更多