首页 > 解决方案 > 批处理与单选的 SQL 不同结果

问题描述

我遇到了谷歌搜索无法回答的绊脚石。我正在构建一个 SQL 脚本来分发给我的用户,以便为我的应用程序的更新版本升级数据库。我使用 Visual Studio v18 SSDT 模式比较工具自动生成了脚本,但是我对脚本进行了大量修改,以便在删除表等之前进行大量存在检查(以免在升级过程中破坏用户数据。)我的问题在于检查 sys.objects 表是否存在触发器和存储过程。运行整个脚本时,提取这些类型对象的查询返回的结果比预期的要少。例如,在下面的脚本中,用于获取所有触发器的 SELECT 语句返回 0 行。但是,如果我只突出显示 SELECT 语句,请右键单击-->在 SSMS 中执行,它按预期返回 1 行。与通过 SSMS 临时运行的单个语句相比,什么可能导致脚本在整体运行时返回不同的结果?

我尝试删除SET ANSI_NULLS...andSET NUMERIC_...行,但在运行脚本时得到相同的 0 结果。

还有其他想法吗?

USE CarrierAPI_seed;
GO

SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
SET NUMERIC_ROUNDABORT OFF;

GO
--Create a temp table with all triggers.
IF OBJECT_ID('TempDB..#CAPI_Upgrade_Triggers','U') IS NOT NULL 
BEGIN
    PRINT 'Dropping table... #CAPI_Upgrade_Triggers';
    DROP TABLE #CAPI_Upgrade_Triggers;  
END
GO

CREATE TABLE #CAPI_Upgrade_Triggers
(
    trigger_name nvarchar(255),
    table_name nvarchar(255)
);
GO

INSERT INTO #CAPI_Upgrade_Triggers (trigger_name, table_name)
SELECT
    s.[name] as trigger_name
    , sp.[name] as table_name
    --, s.*
FROM sys.objects as s
    INNER JOIN sys.objects as sp
        ON sp.[object_id] = s.parent_object_id
WHERE s.[type] = 'TR';
--ORDER BY trigger_name
GO

--Create a temp table with all procedures.
IF OBJECT_ID('TempDB..#CAPI_Upgrade_Procedures','U') IS NOT NULL 
BEGIN
    PRINT 'Dropping table... #CAPI_Upgrade_Procedures';
    DROP TABLE #CAPI_Upgrade_Procedures;  
END
GO

CREATE TABLE #CAPI_Upgrade_Procedures
(
    [procedure_name] nvarchar(255)
);
GO

INSERT INTO #CAPI_Upgrade_Procedures ([procedure_name])
SELECT
    OBJECT_NAME(s.object_id) as procedure_name
    --, *
FROM sys.objects as s
WHERE s.[type] = 'P';
--WHERE s.[name] like 'sp_%';
--ORDER BY s.[name]
GO

SELECT * FROM #CAPI_Upgrade_DefaultConstraints;
SELECT * FROM #CAPI_Upgrade_FKConstraints;
SELECT * FROM #CAPI_Upgrade_Triggers;
SELECT * FROM #CAPI_Upgrade_Procedures;

PRINT SUSER_NAME();
GO

标签: sqlsql-servertsql

解决方案


推荐阅读