2016-04-19 50 views
1

我有一個sql腳本,爲我的sql服務器中的每個數據庫創建表。但是,它在一個創建表腳本上失敗。例如,創建表循環失敗(SQL Server)

CREATE TABLE [dbo].[Mx_Poll_Tags] 

命令。這有什麼問題?我沒看到它。

奇怪的部分是當我一個接一個地在查詢窗口中運行腳本時,他們都能正常工作。只有這個特殊的過程失敗了。

的錯誤狀態:

消息173,15級,狀態1,71號線
列 '單位' 的定義必須包括一個數據類型。

創建腳本是由SQL Server本身通過將現有Mx_Poll_Tags表腳本編寫爲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 
+0

您確實已將'drop table'語句註釋掉了,但我本來會期望得到一個不同的錯誤消息... – HoneyBadger

+0

是的,我評論了它,因爲表格還不存在, 。所以這與我的問題中的錯誤沒有任何關係。 – PitAttack76

+0

基於錯誤消息,我會期望有一個像這樣的'[Unit] NOT NULL,'數據類型丟失的文本行。您確定生成的錯誤消息不對應於確實遺漏/遺漏的查詢嗎?可能會發生複製/過去錯誤,或者可能編輯查詢,就像那樣。 – Igor

回答

4

你可以試試它只是創建該表嗎?

此外,你可以消除「開始」和「結束」?基於此線程:http://www.sqlservercentral.com/Forums/Topic808714-8-1.aspx

我沒有足夠的信譽來作出評論。

編輯:

默認情況下,sys.sp_MSforeachdb @命令1具有爲nvarchar(2000)的參數長度。即使你傳遞了一個varchar(max),超過2000的任何東西都會被截斷。

+0

這也沒有幫助。奇怪的部分是當我直接在de查詢窗口中複製創建腳本時,它確實起作用。只有當它在這個循環中時纔可以。我將補充說明我的問題。 – PitAttack76

+0

我認爲它可能是你的@proc變量的長度。你可以把你的表減少到exec sp_msforeach嗎?我相信默認情況下,sp_msforeachdb具有最大字符長度。 –

+0

你是對的,除了查詢將在'CREATE TABLE [dbo]。[MX_Poll_QA]'語句的某處被截斷。所以錯誤是在錯誤的說法,看來... – HoneyBadger