sql - Go命令错误

标签 sql sql-server t-sql

我有一个正在正确执行的存储过程。现在,我尝试添加 TRY CATCH T-SQL 语句。

添加后

BEGIN TRY

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
SET XACT_ABORT ON
GO

/****** add new column Accountid  to Metainformation table ******/

IF NOT EXISTS (SELECT * FROM SYSCOLUMNS WHERE NAME = 'Accountid' AND ID = OBJECT_ID('[GSF].[dbo].[Metainformation]'))
BEGIN
    ALTER TABLE [GSF].[dbo].[Metainformation] ADD Accountid int 
END
GO



IF EXISTS (SELECT * FROM SYSCOLUMNS WHERE NAME = 'Accountid' AND ID = OBJECT_ID('[GSF].[dbo].[Metainformation]'))
BEGIN
    UPDATE [GSF].[dbo].[Metainformation]  
    SET MP.Accountid = AD.Accountid
    FROM [GSF].[dbo].[Metainformation] MI, [GSF].[dbo].[AccountDetails] AD
    WHERE MI.DetailID= AD.DetailID
END
GO

我的 GO 语句中出现错误,显示错误指出 GO 附近的语法不正确。

有什么可以使用的指针或替代方法吗?

更新的代码:

USE GSF
GO

/****** add new column AccountId  to MetaInformation table ******/
IF NOT EXISTS (SELECT * FROM **SYS.COLUMNS** WHERE NAME = 'AccountId' AND ID = OBJECT_ID('[GSF].[dbo].[MetaInformation]'))
    ALTER TABLE [GSF].[dbo].[MetaInformation] ADD AccountId uniqueidentifier 

BEGIN TRANSACTION;
BEGIN TRY


SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON


/****** If the column AccountId exists, Update all the AccountId values in MetaInformation from AccountDetails ******/

IF EXISTS (SELECT * FROM **SYS.COLUMNS** WHERE NAME = 'AccountId' AND ID = OBJECT_ID('[GSF].[dbo].[MetaInformation]'))
BEGIN
    UPDATE MP  
    SET MP.AccountId = AD.AccountId
    FROM [GSF].[dbo].[MetaInformation] MP
    **INNER JOIN**  
    [GSF].[dbo].[AccountDetails] AD
    ON MP.AllocationDetailId = AD.AllocationDetailId
END

/****** Drop AccountId column from AccountDetails ******/

IF EXISTS (SELECT * FROM SYS.COLUMNS WHERE NAME = 'AccountId' AND ID = OBJECT_ID('[GSF].[dbo].[AccountDetails]'))
    ALTER TABLE [GSF].[dbo].[AccountDetails] DROP COLUMN AccountId 


/****** add two new PStage values to [PStageToCategory] table ******/

INSERT INTO [GSF].[dbo].[PStageToCategory]
   (PStage, PStageToCategoryName)
   VALUES(19,1)

INSERT INTO [GSF].[dbo].[PStageToCategory]
   (PStage, PStageToCategoryName)
   VALUES(21,1)



/****** Drop and create new ViewName view to remove reference of AccountId ******/

USE GSF

IF EXISTS ( SELECT * FROM sys.views WHERE name = 'ViewName')
DROP VIEW ViewName


DECLARE @sql_view NVARCHAR(MAX);
SET @sql_view = '<VIEW DEFINITION>';
EXEC sp_executesql @sql_view;

COMMIT TRANSACTION
END TRY

BEGIN CATCH
SELECT
    ERROR_NUMBER() AS ErrorNumber
   ,ERROR_SEVERITY() AS ErrorSeverity
   ,ERROR_STATE() AS ErrorState
   ,ERROR_PROCEDURE() AS ErrorProcedure
   ,ERROR_LINE() AS ErrorLine
   ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH

我正在使用此脚本来更改生产中的架构。因此,我包括 try catch 只是为了了解错误,并在运行中脚本中出现错误(仅会运行一个错误)时回滚事务。你觉得有道理吗?

此外,我根据您的意见对我的脚本进行了更改。你怎么认为 ?

最佳答案

“GO 不是 Transact-SQL 语句;它是 sqlcmd 和 osql 实用程序以及 SQL Server Management Studio 代码编辑器识别的命令”-- 引自 MSDN .

下面的示例代码假设您只是从 SSMS 或其他实用程序之一执行脚本。

以下是对代码的一些改进。

1 - TRY/CATCH 代码块需要在一批中。因此,GO需要位于区 block 之后。

2 - SYSCOLUMNS 表已折旧,最终将从产品中删除。参见杰森Strate's关于此主题的博客文章。

3 - 如果 IF 表达式后面有一个语句,则不需要 BEGIN/END 代码块。

4 - 您应该避免使用 ANSI 92 连接,因为它们在 SQL Server 2012 中不起作用。请参阅 Mike Walsh 的博客 article关于这个话题。

5 - 存在拼写错误,其中使用了 MP.Accountid 而不是 MI.Accountid。

6 - 在语句末尾使用分号,因为有人认为这是将来的要求。

总之,当我编写存储过程并希望将错误代码返回给调用应用程序时,我使用 TRY/CATCH block 。此示例代码仅返回有关错误的信息。

真诚的

约翰

-- 
-- Use correct database and set session settings
--

-- Switch to correct database
USE [GSF];
GO

-- Change session settings
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET XACT_ABORT ON;
GO


--
-- My code block
--

BEGIN TRY

-- Add column if it does not exist
IF NOT EXISTS (SELECT * FROM SYS.COLUMNS AS C WHERE C.NAME = 'Accountid' AND C.OBJECT_ID = OBJECT_ID('dbo.Metainformation'))
    ALTER TABLE [dbo].[Metainformation] ADD Accountid INT;

-- Update the column regardless
IF EXISTS (SELECT * FROM FROM SYS.COLUMNS AS C WHERE C.NAME = 'Accountid' AND C.OBJECT_ID = OBJECT_ID('dbo.Metainformation'))
    UPDATE Metainformation
    SET Accountid = AD.Accountid
    FROM [dbo].[Metainformation] AS MI JOIN [dbo].[AccountDetails] AS AD ON MI.DetailID = AD.DetailID;

END TRY


--
-- My error handling
--

-- Error Handler
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber
       ,ERROR_SEVERITY() AS ErrorSeverity
       ,ERROR_STATE() AS ErrorState
       ,ERROR_PROCEDURE() AS ErrorProcedure
       ,ERROR_LINE() AS ErrorLine
       ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH

GO

关于sql - Go命令错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18607056/

相关文章:

php - SELECT DISTINCT 有这么多条件

sql - Azure、DocumentDB、如何使用 JOIN 返回唯一结果

sql-server - 无论 ORDER BY 如何,SELECT TOP 都很慢

sql-server - 如何在 SQL Server 中编写任意数量的参数函数

sql - 如何在 SQL Server 中 nvarchar(max) 类型列中现有的 json 结构中添加新属性

sql-server - SQL PRINT 在某些实例中不起作用

php - 最后一行只显示 1 列

SQL - 从多列中分配/减去一列

sql - 如何将日期转换为 DD-MON-YYYY HH24 :MI:SS format?

sql-server - 如何在数据库中存储低基数主数据