t-sql:使用二进制数据类型时替换函数truncate

时间:2013-09-06 10:01:48

标签: sql-server tsql replace

这是重新产生问题的代码:

DECLARE @VBIN BINARY(50)
DECLARE @PASS NVARCHAR(3)
DECLARE @TEXT NVARCHAR(MAX)

SET @TEXT = '123456123789'
SET @PASS = '123'
SET @VBIN = CONVERT(BINARY, N'321')
SELECT REPLACE(@TEXT, @PASS,  CONVERT(NVARCHAR(MAX), @VBIN))

会回来 '321'不是'321456321789'

1 个答案:

答案 0 :(得分:1)

问题是,binary(50)将填充0x00以达到50的固定长度,并且通常将其视为字符串终结符。

您会看到与

相同的行为
SELECT N'The quick brown ' +  NCHAR(0) + N' fox jumped over the lazy dog.'

REPLACE之后数据实际上仍然存在。它试图将其显示为发生截断的字符串。

DECLARE @VBIN BINARY(50)
DECLARE @PASS NVARCHAR(3)
DECLARE @TEXT NVARCHAR(MAX)

SET @TEXT = '123456123789'
SET @PASS = '123'
SET @VBIN = CONVERT(BINARY, N'321')

SELECT REPLACE(@TEXT, @PASS,  CONVERT(NVARCHAR(MAX), @VBIN))
SELECT DATALENGTH(REPLACE(@TEXT, @PASS,  CONVERT(NVARCHAR(MAX), @VBIN))) /*112*/

SELECT CAST(REPLACE(@TEXT, @PASS,  CONVERT(NVARCHAR(MAX), @VBIN)) AS VARBINARY(112))

使用varbinary而非binary可以避免此问题,但我不确定您到底在做什么。