Двоичное (16) усечение до двоичного (4) в операторе CASE - PullRequest
0 голосов
/ 19 апреля 2019

Иметь таблицу:

CREATE TABLE [db].[Table1](
    [Id] [int] NOT NULL,
    [Hash] [binary](16) NOT NULL
) 

С данными:

Id Hash
1  0x00000000000000000000000000000000
2  0x00000000000000000000000000000000

И при попытке выполнить SQL:

UPDATE Table1 SET Hash = CASE Id
WHEN 1 THEN 0x4cb47abddf8a9c348c7a7c20abd0b1d5
ELSE 0
END

Ожидайте, что значение в столбце Hash равно0x4cb47abddf8a9c348c7a7c20abd0b1d5, но фактическое значение 0x00000000000000000000000abd0b1d5.

Если я попытаюсь:

UPDATE Table1 SET Hash =  0x4cb47abddf8a9c348c7a7c20abd0b1d5

Все в порядке.

1 Ответ

3 голосов
/ 19 апреля 2019

Двоичный файл имеет самый низкий приоритет среди всех типов данных в SQL Server ( Приоритет типа данных (SQL Server) ):

SQL Server использует следующий порядок приоритета для типов данных:

  1. пользовательские типы данных (максимальные)
  2. sql_variant
  3. XML
  4. DateTimeOffset
  5. datetime2
  6. Дата и время
  7. smalldatetime
  8. дата
  9. время
  10. поплавок
  11. реальный
  12. 1031 * десятичного *
  13. деньги
  14. smallmoney
  15. BIGINT
  16. INT
  17. SMALLINT
  18. TINYINT
  19. бит
  20. NTEXT
  21. текст
  22. изображение
  23. 1053 * Отметка времени *
  24. UniqueIdentifier
  25. nvarchar (включая nvarchar (max))
  26. NCHAR
  27. varchar (включая varchar (max))
  28. символ
  29. varbinary (включая varbinary (max))
  30. двоичный (самый низкий)

При использовании выражения CASE все возвращаемые значения неявно преобразуются в тип данных с наибольшим значением в возвращаемых значениях. В этом случае у вас есть значение int 0 и значение binary(16) 0x4cb47abddf8a9c348c7a7c20abd0b1d5. При int> binary значение 0x4cb47abddf8a9c348c7a7c20abd0b1d5 преобразуется в int, что приводит к потере данных.

Если важны возвращаемые типы ваших данных, и вы используете в возвращаемых значениях несколько типов данных, явно преобразуйте все значения в правильный тип. В этом случае:

UPDATE Table1
SET Hash = CASE Id WHEN 1 THEN 0x4cb47abddf8a9c348c7a7c20abd0b1d5
                   ELSE CONVERT(binary(16),0)
                   END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...