Sql server SQL Server:使用变量创建表
当尝试执行以下操作时,我得到了错误 味精102,第15级,状态1,第9行Sql server SQL Server:使用变量创建表,sql-server,Sql Server,当尝试执行以下操作时,我得到了错误 味精102,第15级,状态1,第9行 “GO”附近的语法不正确 味精102,第15级,状态1,第11行 “GO”附近的语法不正确 味精102,第15级,状态1,第13行 “GO”附近的语法不正确 有人能告诉我哪里出了问题吗?我不明白语法是怎么错的 DECLARE @table nvarchar(100); DECLARE @sql nvarchar(max); SET @table = 'FooTable'; SET @sql = N'CREATE TAB
“GO”附近的语法不正确 味精102,第15级,状态1,第11行
“GO”附近的语法不正确 味精102,第15级,状态1,第13行
“GO”附近的语法不正确 有人能告诉我哪里出了问题吗?我不明白语法是怎么错的
DECLARE @table nvarchar(100);
DECLARE @sql nvarchar(max);
SET @table = 'FooTable';
SET @sql = N'CREATE TABLE [dbo].[' + @table + '](
[id] [int] IDENTITY(1,1) NOT NULL,
[AddedBy] [int] NOT NULL,
[AddedDate] [datetime2](7) NOT NULL,
CONSTRAINT [PK_' + @table + '] PRIMARY KEY CLUSTERED
( [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[' + @table + '] ADD CONSTRAINT [DF_' + @table + '_AddedBy] DEFAULT ((-1)) FOR [AddedBy]
GO
ALTER TABLE [dbo].[' + @table + '] ADD CONSTRAINT [DF_' + @table + '_AddedDate] DEFAULT (getutcdate()) FOR [AddedDate]
GO';
exec (@sql)
感谢您的帮助。SQL server不喜欢使用
exec()
在动态上下文中发送批处理。所以,忘了GO
。只需将您的查询切片到GO
应该在的位置,然后exec()
逐个切片:
DECLARE @table nvarchar(100);
DECLARE @sql nvarchar(max);
SET @table = 'FooTable';
SET @sql = N'CREATE TABLE [dbo].[' + @table + '](
[id] [int] IDENTITY(1,1) NOT NULL,
[AddedBy] [int] NOT NULL,
[AddedDate] [datetime2](7) NOT NULL,
CONSTRAINT [PK_' + @table + '] PRIMARY KEY CLUSTERED
( [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]'
exec (@sql)
SET @sql = 'ALTER TABLE [dbo].[' + @table + '] ADD CONSTRAINT [DF_' + @table + '_AddedBy] DEFAULT ((-1)) FOR [AddedBy]'
exec (@sql)
SET @sql = 'ALTER TABLE [dbo].[' + @table + '] ADD CONSTRAINT [DF_' + @table + '_AddedDate] DEFAULT (getutcdate()) FOR [AddedDate]'
exec (@sql)
如果您在管理工具中执行代码,该工具将
GO
命令理解为批处理分隔符(就像isql
和osql
工具一样),那么语法就可以了。使用exec()
执行代码时,无法理解GO
命令,因此会出现错误
解决方案是删除GO
语句(或者用结束语句的;
替换它们),然后它将很好地执行,或者内联约束并完全跳过alter table语句(我认为这看起来更干净):
此外,实际上不需要在类型(甚至列名)中使用带引号的标识符,因此您最好删除括号
[]
从脚本中删除所有GO
,然后运行它。客户机工具只是将GO理解为一个批定界符,而不是SQL Server本身。有没有办法我不能提示输入此值?设置@table='FooTable';不幸的是,没有。TSQL不能这样做。使用osql可能会有黑客攻击,但我从未做过类似的事情。SSMS模板是您可以获得的最接近的模板。
SET @sql =
N'CREATE TABLE [dbo].[' + @table + '](
[id] int IDENTITY(1,1) NOT NULL,
[AddedBy] int NOT NULL CONSTRAINT [DF_' + @table + '_AddedBy] DEFAULT ((-1)),
[AddedDate] datetime2(7) NOT NULL CONSTRAINT [DF_' + @table + '_AddedDate] DEFAULT (getutcdate()) ,
CONSTRAINT [PK_' + @table + '] PRIMARY KEY CLUSTERED ( [id] ASC )
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
';