17

テーブルの TIMESTAMP フィールドを文字列に変換して、動的 SQL の一部として出力または実行できるようにしようとしています。SSMS はそれを行うことができるため、それを行うための組み込みメソッドが必要です。ただし、T-SQL を使用して動作させることはできません。

以下は、表の結果を正しく表示します。

SELECT TOP 1 RowVersion FROM MyTable

を示しています0x00000000288D17AE。ただし、結果をより大きな文字列の一部にする必要があります。

DECLARE @res VARCHAR(MAX) = (SELECT TOP 1 'test' + CONVERT(BINARY(8), RowVersion) FROM MyTable)
PRINT(@res)

これによりエラーが発生します。The data types varchar and binary are incompatible in the add operator

DECLARE @res VARCHAR(MAX) = (SELECT TOP 1 'test' + CONVERT(VARCHAR(MAX), RowVersion) FROM MyTable)
PRINT(@res)

これにより、ガベージ文字が発生します。test (®

実際、スペースは単なるヌル文字であり、 を使用して動的 SQL を実行する目的で文字列を終了しますEXEC()

DECLARE @sql VARCHAR(MAX) = 'SELECT TOP 1 ''test'' + CONVERT(VARCHAR(MAX), RowVersion) FROM MyTable'
EXEC (@sql)

これは、「test」という単語を含む表の結果を表示するだけです。CONVERT関数は最初に終端の null 文字を返すため、動的 SQL の「test」以降はすべて切り取られます。

明らかに、結果の文字列を「test0x00000000288D17AE」または10進数に相当するものにしたいのですが、この場合は「test680335278」になります。

どんなアイデアでも大歓迎です。

4

3 に答える 3

26

SELECT 'test' + CONVERT(NVARCHAR(MAX), CONVERT(BINARY(8), RowVersion), 1). 秘訣は、ドキュメンテーション1に従ってCONVERT、スタイルとして を使用することです。(を省略して渡します。)20x

于 2016-12-07T11:41:12.103 に答える
3

コメントで述べたように、文書化されていない関数master.sys.fn_varbintohexstrはバイナリを文字列に変換して、他の文字列値と連結できるようにします。

DECLARE @binary BINARY(8)
SELECT @binary = CAST(1234567890 AS BINARY(8))

SELECT @binary AS BinaryValue, 
       LEFT(master.sys.fn_varbintohexstr(@binary),2) + UPPER(RIGHT(master.sys.fn_varbintohexstr(@binary),LEN(master.sys.fn_varbintohexstr(@binary))-2)) AS VarcharValue,
       'test' + LEFT(master.sys.fn_varbintohexstr(@binary),2) + UPPER(RIGHT(master.sys.fn_varbintohexstr(@binary),LEN(master.sys.fn_varbintohexstr(@binary))-2)) AS ConcatenatedVarcharValue

先に進み、最初の 2 文字を分割し、UPPER関数を適用せずに、バイナリ値のときに表示される形式を正確に再現しました。

結果:

/--------------------------------------------------------------------\
|     BinaryValue    |    VarcharValue    | ConcatenatedVarcharValue |
|--------------------+--------------------+--------------------------|
| 0x00000000499602D2 | 0x00000000499602D2 |  test0x00000000499602D2  |
\--------------------------------------------------------------------/
于 2016-12-07T11:24:14.860 に答える
1

これを見てください:

SELECT 
substring(replace(replace(replace(replace(cast(CAST(GETDATE() AS datetime2) as 
varchar(50)),'-',''),' ',''),':',''),'.',''),1,18)
于 2017-10-10T21:20:04.240 に答える