Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中的函数强制转换不受影响时的情况_Sql_Sql Server - Fatal编程技术网

SQL Server中的函数强制转换不受影响时的情况

SQL Server中的函数强制转换不受影响时的情况,sql,sql-server,Sql,Sql Server,我尝试选择如下所示: CREATE TABLE v_test ( id int, name char(4) ); INSERT INTO v_test SELECT 1, NULL UNION SELECT 2, NULL SELECT id, CASE WHEN name IS NULL THEN ' ' ELSE CAST((LEFT(name, 2) + ':'

我尝试选择如下所示:

CREATE TABLE v_test 
(
    id int,
    name char(4)
);

INSERT INTO v_test
    SELECT 1, NULL
    UNION
    SELECT 2, NULL

SELECT
    id,  
    CASE 
       WHEN name IS NULL
          THEN '   ' 
          ELSE CAST((LEFT(name, 2) + ':' + SUBSTRING(name, 3, 2) + ':00') AS TIME) 
    END AS test,
    name
FROM
    v_test;

SELECT
    id,  
    CASE
       WHEN name IS NULL
          THEN '   ' 
          ELSE '0'
    END AS test,
    name
FROM v_test;
这些查询的结果如下所示:

您可以看到,在函数强制转换中不受影响时的结果情况。有人能给我解释一下细节吗?

这句话“你可以看到,在函数转换中不受影响时的结果情况。”恐怕毫无意义。我想你要问的是为什么值
'
显示为
00:00:00.0000000

根据文件规定:

从中的类型集中返回优先级最高的类型 结果\u表达式和可选的else\u结果\u表达式。更多 有关详细信息,请参阅

如果我们也参考上述链接文档,则会提供(当前)数据类型的先例:

SQL Server对数据类型使用以下优先顺序:

  • 用户定义的数据类型(最高)
  • sql_变体
  • xml
  • 日期时间偏移
  • 日期时间2
  • 日期时间
  • smalldatetime
  • 日期
  • 时间
  • 浮动
  • 真实的
  • 十进制
  • 小额钱
  • 比基特
  • int
  • 斯莫林
  • 钻头
  • 内文
  • 正文
  • 形象
  • 时间戳
  • 唯一标识符
  • nvarchar(包括nvarchar(最大))
  • 恩查尔
  • varchar(包括varchar(最大))
  • 煤焦
  • varbinary(包括varbinary(最大))
  • 二进制(最低)
  • 请注意,
    time
    varchar
    具有更高的优先级,因此您的值
    '
    被隐式转换为
    time
    ,而
    CONVERT(time,)='00:00:00.0000000'
    这句话“您可以看到,在函数转换中不受影响时的结果大小写。”恐怕毫无意义。我想你要问的是为什么值
    '
    显示为
    00:00:00.0000000

    根据文件规定:

    从中的类型集中返回优先级最高的类型 结果\u表达式和可选的else\u结果\u表达式。更多 有关详细信息,请参阅

    如果我们也参考上述链接文档,则会提供(当前)数据类型的先例:

    SQL Server对数据类型使用以下优先顺序:

  • 用户定义的数据类型(最高)
  • sql_变体
  • xml
  • 日期时间偏移
  • 日期时间2
  • 日期时间
  • smalldatetime
  • 日期
  • 时间
  • 浮动
  • 真实的
  • 十进制
  • 小额钱
  • 比基特
  • int
  • 斯莫林
  • 钻头
  • 内文
  • 正文
  • 形象
  • 时间戳
  • 唯一标识符
  • nvarchar(包括nvarchar(最大))
  • 恩查尔
  • varchar(包括varchar(最大))
  • 煤焦
  • varbinary(包括varbinary(最大))
  • 二进制(最低)

  • 请注意,
    time
    varchar
    具有更高的优先级,因此您的值
    '
    被隐式转换为
    time
    ,并且
    CONVERT(time')='00:00:00.0000000'
    case
    表达式将只返回一个
    类型
    ,在第一个版本中,您有两个
    类型
    一个是
    varchar
    ,另一个是
    time

    如果我们查看类型的
    优先级
    ,则
    时间
    的优先级高于
    变量字符

    因此,您需要转换:

    select id,  
           (case when name is null 
                 then '   ' 
                 else cast(CAST((LEFT(name,2)+ ':' + SUBSTRING(name,3,2)+':00') AS TIME) as varchar(255)) 
            end) as test,
           name 
    from v_test;
    

    case
    表达式将只返回一个
    类型
    ,在第一个版本中,您有两个
    类型
    一个是
    varchar
    ,另一个是
    时间

    如果我们查看类型的
    优先级
    ,则
    时间
    的优先级高于
    变量字符

    因此,您需要转换:

    select id,  
           (case when name is null 
                 then '   ' 
                 else cast(CAST((LEFT(name,2)+ ':' + SUBSTRING(name,3,2)+':00') AS TIME) as varchar(255)) 
            end) as test,
           name 
    from v_test;
    

    大小写
    表达式生成的值必须是特定类型的值,该值基于所有
    THEN
    子句和
    ELSE
    中的所有可能类型
    time
    的优先级高于
    (n)(var)char
    (并且
    time
    无论如何不能包含空字符串)由
    大小写
    表达式生成的值必须是特定的类型,它基于所有
    然后
    子句和
    其他
    中的所有可能类型<代码>时间
    的优先级高于
    (n)(var)char
    (并且
    时间
    无论如何不能包含空字符串)