在通过CASE
函数调用使用SQL Server SUBSTRING
语句时遇到错误:
DECLARE @string VARCHAR(MAX)
SELECT
sys.Netbios_Name0, sys.name0, sys.Operating_System_Name_and0,
sys.AD_Site_Name0, sys1.DisplayName0, sys1.Version0,
sys2.TopConsoleUser0, sys3.model0,
CASE sys.Operating_System_Name_and0
WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '6.3'
THEN 'Windows 8'
WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '6.2'
THEN 'Windows 8'
WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '6.1'
THEN 'Windows 7'
WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '6.0'
THEN 'Windows Vista'
WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '5.2'
THEN 'Windows XP'
WHEN SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = '5.0'
THEN 'Windows 2000'
ELSE 'sys.Netbios_Name0'
END AS WindowsVersion
FROM
fn_rbac_Add_Remove_Programs(1) sys1
INNER JOIN
v_r_system sys ON sys.ResourceID = sys1.ResourceID
LEFT OUTER JOIN
v_GS_COMPUTER_SYSTEM sys3 ON sys1.ResourceID = sys3.ResourceID
LEFT OUTER JOIN
v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP sys2 ON sys.Resourceid = sys2.ResourceID
-- WHERE sys1.DisplayName0 LIKE '%' + @prodname + '%' AND sys1.version0 LIKE CONVERT(VARCHAR(10), @variable) + '%'
我收到此错误:
第15级状态1行6的消息102
'='附近的语法不正确。
我做错什么了吗?请让我知道
答案 0 :(得分:1)
您正在为case
表达式混合两个可能的语法选项。
一个人:
CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
另一个是:
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
您可以在相同的case
表达式中同时使用第一个或第二个。
由于when
部分中的所有表达式都是
sys.SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0) = <some value>
,您的案例表达式可以使用第一个选项编写:
CASE sys.SUBSTRING(sys.Operating_System_Name_and0, PATINDEX('%[0-9]%', sys.Operating_System_Name_and0), sys.Operating_System_Name_and0)
WHEN '6.3'
THEN 'Windows 8'
WHEN '6.2'
THEN 'Windows 8'
WHEN '6.1'
THEN 'Windows 7'
WHEN '6.0'
THEN 'Windows Vista'
WHEN '5.2'
THEN 'Windows XP'
WHEN '5.0'
THEN 'Windows 2000'
ELSE 'sys.Netbios_Name0'
END AS WindowsVersion
答案 1 :(得分:0)
sys.Operating_System_Name_and0
区分大小写。所以案例陈述应该像
SELECT ...
CASE /*comment col name here*/
WHEN substring(...) = ...
....