1

問題を再現するコードは次のとおりです。

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))

「321456321789」の代わりに「321」を返します

4

1 に答える 1

1

問題は、50 の固定長に到達するためにbinary(50)パディング0x00され、通常は文字列ターミネータとして扱われることです。

と同じ動作が見られます

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しますが、とにかくここで実際に何をしようとしているのかわかりません。

于 2013-09-06T10:16:19.687 に答える