我怎样才能使这个查询 sargable?

Man*_*eld 6 sql-server t-sql type-conversion sql-server-2014

我有一个查询,它根据一个timestamp值连接两个表(不要问)。

其中一个表将数据存储在具有Timestamp数据类型的列中。另一个将其存储为varchar.

以前,查询将timestamp列转换varchar为用于连接的 a。据我了解,这不是 sargable,所以我想做相反的事情。(timestamp表要大得多,效率更是一个问题)。

SELECT * 
FROM TABLE1 
INNER JOIN TABLE2 
    ON UPPER(master.dbo.fn_sqlvarbasetostr(cast(TimestampColumn as binary(8))))
       = VARCHARTIMESTAMPCOLUMN
Run Code Online (Sandbox Code Playgroud)

我试过了:

CONVERT(ROWVERSION, N'0x0000000003306BDD')
Run Code Online (Sandbox Code Playgroud)

没有错误,但表上没有匹配项(当一行肯定存在时)。

CONVERT(ROWVERSION, CAST(N'0x0000000003306BDD' as bigint))
Run Code Online (Sandbox Code Playgroud)

这会导致错误转换nvarcharbigint.

如何将varchar值转换为 atimestamp而不是相反?

Pau*_*ite 12

在 SQL Server 2008 中,将二进制转换为字符表示变得更快更容易

CREATE TABLE dbo.X
(
    pk integer PRIMARY KEY,
    c1 integer NOT NULL,
    rv rowversion NOT NULL,
    rvc AS CONVERT(char(18), CONVERT(binary(8), rv), 1)
);
Run Code Online (Sandbox Code Playgroud)

注意to上的style 1 选项。此外,该类型等效于(当不可为空时,否则)。CONVERTcharrowversionbinary(8)varbinary(8)

我们现在可以在计算列上创建索引:

-- Create index on the computed column
-- Note PERSISTED is *not* required
CREATE UNIQUE INDEX i 
ON dbo.X (rvc);
Run Code Online (Sandbox Code Playgroud)

添加一些示例数据:

-- Some rows
INSERT dbo.X
    (pk, c1)
VALUES
    (1, 100),
    (2, 200),
    (3, 300);
Run Code Online (Sandbox Code Playgroud)

并显示结果:

-- Show the data
SELECT
    X.pk,
    X.c1,
    X.rv,
    X.rvc
FROM dbo.X AS X;
Run Code Online (Sandbox Code Playgroud)

输出示例:

输出行

rowversions以字符格式加入表格的任务现在是微不足道的。

SQL Server 2005 版本

这需要一个辅助函数:

CREATE FUNCTION dbo.Bin8ToHexStr
    (@Hex binary(8))
RETURNS char(18)
WITH SCHEMABINDING
AS
BEGIN
    RETURN 
        '0x' + 
        CONVERT(xml, N'').value('xs:hexBinary(sql:variable("@Hex"))', 'char(16)');
END;
Run Code Online (Sandbox Code Playgroud)

表定义变为:

CREATE TABLE dbo.X
(
    pk integer PRIMARY KEY,
    c1 integer NOT NULL,
    rv rowversion NOT NULL,
    rvc AS dbo.Bin8ToHexStr(CONVERT(binary(8), rv))
);
Run Code Online (Sandbox Code Playgroud)

其他一切都像以前一样进行,包括索引。