visual studio 2013 年的 ssdt 项目 - 为非空表部署 alterscript

ssdt project in visual studio 2013 - Deploy alterscript for not empty Tables

我希望你能帮助我。 我在 Visual Studio 2013 SDDT 项目的 Schemacomparetool 中使用 Skriptgeneration。我的问题是我需要更新一个不为空的 Table。

Schemacompartool 使这个:

/*
The type for column Bundesland in table [dbo].[Arbeitsfreiertag] is currently  VARCHAR (50) NULL but is being changed to  BIGINT NULL. Data loss could occur.
*/

IF EXISTS (select top 1 1 from [dbo].[Arbeitsfreiertag])
    RAISERROR (N'Rows were detected. The schema update is terminating because data loss might occur.', 16, 127) WITH NOWAIT

GO

...
PRINT N'Altering [dbo].[Arbeitsfreiertag]...';


GO
ALTER TABLE [dbo].[Arbeitsfreiertag] ALTER COLUMN [Bundesland] BIGINT NULL;

我还需要像 Managment Studio Designer 更改这样的更改脚本:

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_Arbeitsfreiertag
    (
    ID bigint NOT NULL,
    Bundesland bigint NULL,
    Name varchar(50) NOT NULL,
    ArbeitsfreiertagTyp bigint NOT NULL,
    Beginn datetime NOT NULL,
    Beschreibung varchar(200) NULL,
    Ende datetime NULL,
    Land bigint NOT NULL,
    Wiederholend int NOT NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_Arbeitsfreiertag SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.Arbeitsfreiertag)
     EXEC('INSERT INTO dbo.Tmp_Arbeitsfreiertag (ID, Bundesland, Name, ArbeitsfreiertagTyp, Beginn, Beschreibung, Ende, Land, Wiederholend)
        SELECT ID, CONVERT(bigint, Bundesland), Name, ArbeitsfreiertagTyp, Beginn, Beschreibung, Ende, Land, Wiederholend FROM dbo.Arbeitsfreiertag WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.Arbeitsfreiertag
GO
EXECUTE sp_rename N'dbo.Tmp_Arbeitsfreiertag', N'Arbeitsfreiertag', 'OBJECT' 
GO
ALTER TABLE dbo.Arbeitsfreiertag ADD CONSTRAINT
    PK_Arbeitsfreiertag PRIMARY KEY CLUSTERED 
    (
    ID
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
COMMIT

我需要一个选项来在 ShemaCompartool 中进行设置。

希望你能理解我的问题。

谢谢史蒂芬

我认为问题在于您的主要数据类型是 NVARCHAR 而您想将其更改为 BIGINT。在一般情况下,它会失败,因为您无法将任何字符串转换为整数。

您需要做的是手动创建预部署和post-部署脚本并在那里处理数据转换。该脚本应如下所示:

--This is pre-deployment script
-- data backup into temp table
PRINT 'Backup data from dbo.Arbeitsfreiertag'
SELECT * INTO tmp_Arbeitsfreiertag from dbo.Arbeitsfreiertag
GO

PRINT 'TRUNCATE TABLE dbo.Arbeitsfreiertag'
TRUNCATE TABLE dbo.Arbeitsfreiertag
GO

--This is post-deployment script
--copy data from temp table into main table
PRINT 'Copy data from temp table tmp_Arbeitsfreiertag into main table'

INSERT INTO dbo.Arbeitsfreiertag (ID, Bundesland, Name, ArbeitsfreiertagTyp, Beginn, Beschreibung, Ende, Land, Wiederholend)
SELECT ID, CONVERT(bigint, Bundesland), Name, ArbeitsfreiertagTyp, Beginn, Beschreibung, Ende, Land, Wiederholend 
FROM tmp_Arbeitsfreiertag WITH (HOLDLOCK TABLOCKX)
GO

IF ((SELECT COUNT(1) FROM tmp_Arbeitsfreiertag) = (SELECT COUNT(1) FROM Arbeitsfreiertag))
BEGIN
  PRINT 'DROP TABLE tmp_Arbeitsfreiertag'
  DROP TABLE tmp_Arbeitsfreiertag
END
GO