创建表在循环中失败(SQL Server)
我有一个sql脚本,可以为sql server中的每个db创建表。但是,它在一个创建表脚本上失败。例如创建表在循环中失败(SQL Server),sql,sql-server,Sql,Sql Server,我有一个sql脚本,可以为sql server中的每个db创建表。但是,它在一个创建表脚本上失败。例如 CREATE TABLE [dbo].[Mx_Poll_Tags] 指挥部。这有什么问题?我看不出来 奇怪的是,当我在查询窗口中逐个运行脚本时,它们都工作得很好。只是这个特殊的过程失败了 错误状态为: 味精173,第15级,状态1,第71行 列“Unit”的定义必须包含数据类型 创建脚本是由SQL Server本身通过将现有的Mx\u Poll\u标记表编写为CreateTo来创建的 有人
CREATE TABLE [dbo].[Mx_Poll_Tags]
指挥部。这有什么问题?我看不出来
奇怪的是,当我在查询窗口中逐个运行脚本时,它们都工作得很好。只是这个特殊的过程失败了
错误状态为:
味精173,第15级,状态1,第71行列“Unit”的定义必须包含数据类型 创建脚本是由SQL Server本身通过将现有的
Mx\u Poll\u标记
表编写为CreateTo
来创建的
有人知道错误是什么吗
BEGIN
declare @proc nvarchar(max)
set @proc='if ''?'' like ''Client_%''
begin
use [?]
print ''?''
DROP TABLE [dbo].[ManualMetersInput]
DROP TABLE [dbo].[ManualMeterActions]
DROP TABLE [dbo].[ManualMeters]
DROP TABLE [dbo].[MX_Poll]
--DROP TABLE [dbo].[Mx_Poll_Tags]
DROP TABLE [dbo].[MX_Poll_Info]
DROP TABLE [dbo].[MX_Poll_Logs]
DROP TABLE [dbo].[MX_Poll_QA]
--DROP TABLE [dbo].[MX_Poll_Vars]
CREATE TABLE [dbo].[ManualMeters]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Ean] [varchar](max) NULL,
[Period] [int] NULL,
[TagTable] [varchar](max) NULL,
[TagTableId] [varchar](max) NOT NULL,
[Overflow] [int] NULL,
[TZ] [varchar](max) NULL,
) ON [PRIMARY]
CREATE TABLE [dbo].[ManualMetersInput]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Timestamp] [datetime2](7) NOT NULL,
[ManualMeterId] [int] NOT NULL,
[Value] [decimal](18, 3) NOT NULL,
[IsOverflow] [bit] NOT NULL,
[ImportDate] [datetime2](7) NOT NULL,
) ON [PRIMARY]
CREATE TABLE [dbo].[ManualMeterActions]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[ManualMeterId] [int] NOT NULL,
[UserId] [int] NOT NULL,
[Type] [nvarchar](max) NOT NULL,
) ON [PRIMARY]
CREATE TABLE [dbo].[MX_Poll]
(
[timestamp] [datetime2](7) NOT NULL,
[localtimestamp] [datetime2](7) NOT NULL,
) ON [PRIMARY]
CREATE TABLE [dbo].[MX_Poll_Info]
(
[timestamp] [datetime2](7) NOT NULL,
[info] [nvarchar](max) NOT NULL,
) ON [PRIMARY]
CREATE TABLE [dbo].[MX_Poll_Logs]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[timestamp] [datetime2](7) NOT NULL,
[Message] [nvarchar](max) NULL,
) ON [PRIMARY]
CREATE TABLE [dbo].[MX_Poll_QA]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[timestamp] [datetime2](7) NOT NULL,
[tag] [nvarchar](max) NULL,
[QA] [int] NULL
) ON [PRIMARY]
-- error here
CREATE TABLE [dbo].[Mx_Poll_Tags]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](800) NOT NULL,
[Unit] [int] NOT NULL,
[FieldName] [nvarchar](100) NULL,
[ScaleFromMin] [decimal](18, 3) NULL,
[ScaleFromMax] [decimal](18, 3) NULL,
[ScaleToMin] [decimal](18, 3) NULL,
[ScaleToMax] [decimal](18, 3) NULL,
[DeltaOfKwhCounter_Id] [int] NULL,
[Visible] [int] NULL,
[Type] [nvarchar](50) NULL,
[Enable] [int] NULL,
[Content] [int] NULL,
[Quantity] [int] NULL,
[Signal] [int] NULL,
[SignalDescription] [nvarchar](max) NULL,
[Connection] [nvarchar](max) NULL,
[Cable] [nvarchar](max) NULL,
[Comments] [nvarchar](max) NULL,
[UsedForPrediction_0] [bit] NOT NULL,
[RelatedToPrediction_0] [bit] NOT NULL,
[CalculatedByPredictionNo] [int] NULL,
) ON [PRIMARY]
end';
--print @proc;
exec sp_MSForEachDB @proc
END
GO
你能试着创建那个表吗 还有,你能去掉“开始”和“结束”吗?基于此线程: 我没有足够的声誉来评论这件事 编辑:
默认情况下,sys.sp_MSforeachdb@command1的参数长度为nvarchar(2000)。即使您正在传递一个varchar(max),超过2000的任何内容都将被截断。您可以尝试创建该表吗 还有,你能去掉“开始”和“结束”吗?基于此线程: 我没有足够的声誉来评论这件事 编辑:
默认情况下,sys.sp_MSforeachdb@command1的参数长度为nvarchar(2000)。即使您正在传递一个varchar(max),超过2000的任何内容都会被截断。您的
drop table
语句被注释掉了,尽管我希望会出现不同的错误消息……是的,我注释掉了它,因为该表还不存在,否则drop会给出一个错误。因此,这与我问题中的错误无关..根据错误消息,我希望在缺少数据类型的地方会有这样一个[Unit]NOT NULL,
文本行。您确定生成的错误消息不对应于某个查询,而该查询确实被取消/省略了吗?可能发生复制/过去错误或编辑查询之类的情况。您还可以查看print@proc
的结果。我真的无法想象你在那里丢失了你的数据类型,但这是一个简单的测试。unit是一个关键字吗?在这种情况下,编译器会有不同的看法吗?Try units您的drop table
语句被注释掉了,尽管我希望会出现不同的错误消息……是的,我注释掉了它,因为该表还不存在,否则drop会产生错误。因此,这与我问题中的错误无关..根据错误消息,我希望在缺少数据类型的地方会有这样一个[Unit]NOT NULL,
文本行。您确定生成的错误消息不对应于某个查询,而该查询确实被取消/省略了吗?可能发生复制/过去错误或编辑查询之类的情况。您还可以查看print@proc
的结果。我真的无法想象你在那里丢失了你的数据类型,但这是一个简单的测试。unit是一个关键字吗?在这种情况下,编译器会有不同的看法吗?试试也没用的单位。奇怪的是,当我在反查询窗口中直接复制create脚本时,它确实起作用了。只有当它在循环中时才不会。我将把它添加到我的问题描述中。我认为它可能是@proc变量的长度。您能否将进程减少到只包含表的exec sp_msforeach。我相信默认情况下,sp_msforeachdb有一个最大字符长度。您是对的,只是查询将在CREATE TABLE[dbo].[MX_Poll\u QA]
语句中的某个地方被截断。所以错误出现在错误的语句中,似乎…当我将查询粘贴到word中时,它是2184个字符。在Mx_Poll_Tags Create Table语句中,第2000个字符位于注释之后。看来这个答案是正确的。@ArthurDaniels;你说得对。这就是问题所在。我已经把它拆开了,现在它可以正常工作了。经验教训:)这也没用。奇怪的是,当我在反查询窗口中直接复制create脚本时,它确实起作用了。只有当它在循环中时才不会。我将把它添加到我的问题描述中。我认为它可能是@proc变量的长度。您能否将进程减少到只包含表的exec sp_msforeach。我相信默认情况下,sp_msforeachdb有一个最大字符长度。您是对的,只是查询将在CREATE TABLE[dbo].[MX_Poll\u QA]
语句中的某个地方被截断。所以错误出现在错误的语句中,似乎…当我将查询粘贴到word中时,它是2184个字符。在Mx_Poll_Tags Create Table语句中,第2000个字符位于注释之后。看来这个答案是正确的。@ArthurDaniels;你说得对。这就是问题所在。我已经把它拆开了,现在它可以正常工作了。经验教训:)