SQL Server - 来自简单愚蠢查询的差异结果?

Aks*_*hay 0 sql sql-server

为什么这些简单的查询返回不同的结果?只有差异@val.

查询#1:

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

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

查询#2:

SELECT 1
WHERE CAST(SUBSTRING('0320', 3, 2) AS INT) + 2000 < YEAR(GETDATE())
Run Code Online (Sandbox Code Playgroud)

小智 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
Run Code Online (Sandbox Code Playgroud)