未捕获的错误 - 如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中

时间:2017-07-10 17:27:25

标签: sql-server sql-server-2008 stored-procedures tfs tfsbuild

我们如何配置我们的TFS门控构建验证来捕获解析器验证错误?

例如,我们有一个带有无效语句的存储过程,该语句不断传递门控TFS签入 XAML构建验证,甚至将 SSDT 发布传递给 SQL Server 2008R2 数据库整整两年!

CREATE PROCEDURE This_Should_Fail
AS BEGIN
    DECLARE @TableVariable TABLE(
        ID INT IDENTITY(1, 1),
        Name VARCHAR(MAX)
    )
    SELECT DISTINCT TOP 1 Name
    FROM @TableVariable
    ORDER BY ID
END

当我运行此语句时,我收到相应的错误,但当我在TFS中运行完整版本时没有错误

消息145,级别15,状态1,过程This_Should_Fail,第7行 如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中。

直到最近,当定义更改时才会出现错误,在运行时甚至不会抛出任何错误

CREATE PROCEDURE This_Should_Fail
AS BEGIN
    DECLARE @TableVariable TABLE(
        ID INT IDENTITY(1, 1),
        Name VARCHAR(MAX),
        ForeignKeyID INT
    )

    --create some sample data
    INSERT INTO @TableVariable(Name, ForeignKeyID)
    VALUES ('Obj1', 999), ('Obj2', 999), ('Obj3', 0), ('Obj4', 0)

    DECLARE @ForeignKeyID INT = 999--some lookup here

    SELECT DISTINCT TOP 1 Name
    FROM @TableVariable
    WHERE ForeignKeyID = @ForeignKeyID
END

在TFS分支的更改未能在任何地方部署之前,进行了更改后整整一个月。在这两种情况下,所有选定的列都没有排序。

这让我更加困惑,因为即使在SSMS 2014中手动运行,TFS中的任何版本(我都不能包括因为它是我的公司的IP)都会引发任何错误!

感谢。

1 个答案:

答案 0 :(得分:1)

门控签到是一种持续集成构建的形式。在TFS中,它创建一个包含正在验证的代码的shelveset,然后运行该代码的构建。只有代码成功构建所有已配置的单元测试通过,才能实际签入代码。

换句话说,验证由您的构建/测试直接控制,而不是由TFS控制。如果构建未捕获错误或未通过测试测试。然后它会在实际部署到服务器后生效。

执行此操作的一种方法是捕获构建的日志信息,然后使用Logging Commandsexit 1使构建失败。更多细节您可以参考这个问题:How to fail the build from a PowerShell task in TFS 2015(对于vNext构建)