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)
这会导致错误转换nvarchar为bigint.
如何将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)
其他一切都像以前一样进行,包括索引。
| 归档时间: |
|
| 查看次数: |
733 次 |
| 最近记录: |