Sql server Msg 102,15级,状态1靠近'的语法不正确&燃气轮机';

Sql server Msg 102,15级,状态1靠近'的语法不正确&燃气轮机';,sql-server,Sql Server,我有一个SQL Server过程,如下所示: //Beginning of procedure SELECT CASE IDNumber WHEN (DATALENGTH(IDNumber)>7) THEN SUBSTRING(IDNumber,0,6) WHEN (DATALENGTH(IDNumber) < 7)

我有一个SQL Server过程,如下所示:

//Beginning of procedure 
   SELECT 
          CASE IDNumber
                 WHEN (DATALENGTH(IDNumber)>7) 
                  THEN SUBSTRING(IDNumber,0,6)
                 WHEN (DATALENGTH(IDNumber) < 7)
                  THEN CONCAT((REPLICATE(0,7-LEN(IDNumber)),IDNumber)
          END AS NID

//Rest of the procedure here
//过程的开始
挑选
案件编号
当(数据长度(IDNumber)>7)
然后是子字符串(IDNumber,0,6)
当(数据长度(IDNumber)<7)
然后CONCAT((复制(0,7-LEN(IDNumber)),IDNumber)
以NID结束
//剩下的程序在这里
执行时的代码在“>”附近抛出错误
错误语法。
在第
行(DATALENGTH(IDNumber)>7)

IDNumber
是一个
nvarchar
。我尝试使用
LEN(IDNumber)
,但没有成功。
我不知道错误是什么!

像这样重写您的查询:

SELECT CASE 
        WHEN DATALENGTH(IDNumber) > 7 THEN SUBSTRING(IDNumber, 0, 6)
        WHEN DATALENGTH(IDNumber) < 7 THEN CONCAT(REPLICATE(0, LEN(IDNumber)), IDNumber)
    END AS NID;
选择案例
当DATALENGTH(IDNumber)>7时,则子字符串(IDNumber,0,6)
当DATALENGTH(IDNumber)<7时,则为CONCAT(REPLICATE(0,LEN(IDNumber)),IDNumber)
以NID结束;

编写
CASE列时,必须将其与直接值进行比较,而不是与表达式进行比较。

如果有CASE变量,则需要向When part提供值,而不是条件

在CASE之后立即删除IDNumber。此外,不需要在其周围加括号(DATALENGTH…)但它们并没有造成任何影响。复制函数需要2个参数。CONCAT(REPLICATE(0,7,LEN(IDNumber)),IDNumber)需要更改。非常感谢。那么,我应该在什么时候提供表达式或列名来选择[column或expression]?或者,这不是合适的方法吗?@b.g您应该使用Select CASE[column或expression]只有在比较相等时,例如
选择CASE Name when'Evaldas',when'Muhammad'when END
,这与执行
选择CASE when Name='Evaldas'(…)
@b.g Gabriel说的:)