用SP_EXECUTESQL动态命名数据库的T-SQL创建表



我正在尝试使用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

此脚本导致此错误:

msg 102,15级,状态1,第2行
" @tableName"附近的错误语法。

根据sp_executeSQL的参数?

,指定表名称的最佳方法是什么?

即使我们使用 sp_executesql过程,也无法将tabename作为参数传递。您必须构建自己的动态SQL查询

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

当您将表名称作为参数传递给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

相关内容

  • 没有找到相关文章

最新更新