Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:使用变量创建表_Sql Server - Fatal编程技术网

Sql server SQL Server:使用变量创建表

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

当尝试执行以下操作时,我得到了错误

味精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 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]
';