2015-12-17 2 views
0

Почему эти простые запросы возвращают разные результаты? Только diff - @val.SQL Server - Diff результат простого глупого запроса?

Запрос # 1:

DECLARE @val NVARCHAR 
BEGIN 
    SET @val = '0320' 

    SELECT 1 
    WHERE CAST(SUBSTRING(@val, 3, 2) AS INT) + 2000 < YEAR(GETDATE()) 
END 

Запрос # 2:

SELECT 1 
WHERE CAST(SUBSTRING('0320', 3, 2) AS INT) + 2000 < YEAR(GETDATE()) 
+10

, потому что 'NVARCHAR' без длины =' NVARCHAR (1) ' – Devart

+1

Потому что вы только литье' @ val' как 'NVARCHAR (1)', то есть единственное, что она хранящий в своей стоимости, '» 0''. Нижний запрос имеет полную строку. – Siyual

+0

проклятье! теперь я понял ... спасибо за помощь глупым людям в этом. – Sak

ответ

8

Потому что вы не объявили размер переменной NVARCHAR, так и в первом примере содержание @val является '0', а не '0320'.

Чтобы исправить это, используйте DECLARE @val NVARCHAR(10).

DECLARE @val NVARCHAR(10) 
BEGIN 
    SET @val = '0320' 
    SELECT 1 
    WHERE CAST(SUBSTRING(@val, 3, 2) AS INT) + 2000 < YEAR(GETDATE()) 
END