T-SQL Create Table with Dynamically Named Database with sp_executesql
T-SQL Create Table with Dynamically Named Database with sp_executesql
我正在尝试使用 sp_executesql 在 T-SQL 中创建一个 table。包含 table 的数据库名称是动态的。
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, Level 15, State 1, Line 2
Incorrect syntax near '@TableName'.
根据 sp_executeSQL
的参数动态创建 table 的名称的最佳方法是什么?
当您将 table 名称作为参数传递给 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
即使我们使用 sp_executesql
过程,您也不能将表名作为参数传递。您必须构建自己的动态 sql 查询
SELECT @CreateTable =
N'
CREATE TABLE ' + @TableName + '
(
ID int
)
'
Exec sp_executesql @CreateTable
我正在尝试使用 sp_executesql 在 T-SQL 中创建一个 table。包含 table 的数据库名称是动态的。
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, Level 15, State 1, Line 2
Incorrect syntax near '@TableName'.
根据 sp_executeSQL
的参数动态创建 table 的名称的最佳方法是什么?
当您将 table 名称作为参数传递给 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
即使我们使用 sp_executesql
过程,您也不能将表名作为参数传递。您必须构建自己的动态 sql 查询
SELECT @CreateTable =
N'
CREATE TABLE ' + @TableName + '
(
ID int
)
'
Exec sp_executesql @CreateTable