为什么我不能用这个动态 SQL 创建一个 table?
Why I can't create a table with this dynamic SQL?
我有一个程序:
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';
我收到这个错误:
Msg 102, Level 15, State 1, Line 12
Incorrect syntax near '@tableName'.
您将需要这样的东西:
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';
您无法创建 table 的原因是因为参数仅适用于查询中的值,不适用于 table 名称或列名称。
我经常使用 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;
我有一个程序:
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';
我收到这个错误:
Msg 102, Level 15, State 1, Line 12
Incorrect syntax near '@tableName'.
您将需要这样的东西:
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';
您无法创建 table 的原因是因为参数仅适用于查询中的值,不适用于 table 名称或列名称。
我经常使用 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;