繁体   English   中英

T-SQL存储过程CASE问题

[英]T-SQL Stored procedure CASE issue

你能告诉我我在做什么错吗?

CREATE PROC [dbo].[GetUserEULASelection] (@username VARCHAR(150))
AS
BEGIN
    DECLARE @result VARCHAR(250);

    SELECT @result = a.NAME
    FROM licmn_license_users_accounts_c ua
    JOIN accounts a ON a.id = ua.licmn_license_users_accountsaccounts_ida
    JOIN licmn_license_users lu ON lu.id = licmn_license_users_accountslicmn_license_users_idb
    WHERE lu.username = @username;

    CASE 
        WHEN @result IS NOT NULL
            THEN SELECT @result AS 'name'
        END
    CASE 
        WHEN @result IS NULL
            THEN SELECT '0' AS 'name'
    END
END

我是T-SQL的新手(我将MySQL程序移植到MSSQL)

问题是case语句导致编译错误。

出问题了,您使用的CASE错误。 在这种情况下,您要将其与IF混合在一起

因此,您应该正确执行以下操作:

IF @result IS NOT NULL
   SELECT @result AS name
ELSE
    SELECT '0' AS name

如果您想使用CASE,您应该在查询中执行:

 SELECT CASE 
       WHEN a.NAME IS NULL THEN '0'
       ELSE a.NAME 
     END as Name
    FROM licmn_license_users_accounts_c ua
    JOIN accounts a ON a.id = ua.licmn_license_users_accountsaccounts_ida
    JOIN licmn_license_users lu ON lu.id = licmn_license_users_accountslicmn_license_users_idb
    WHERE lu.username = @username;

case不是控制流构造。 if是控制流程。 我建议用单个select替换case

SELECT coalesce(@result, '0') AS name;

同样,仅对字符串和日期常量使用单引号。 您正在使用单引号作为列别名。 尽管受支持,但这通常会导致代码中出现其他问题。

编辑:

您可以将存储过程的整体替换为:

SELECT coalesce(max(a.NAME), '0')
FROM licmn_license_users_accounts_c ua JOIN
     accounts a
     ON a.id = ua.licmn_license_users_accountsaccounts_ida JOIN
     licmn_license_users lu
     ON lu.id = licmn_license_users_accountslicmn_license_users_idb
WHERE lu.username = @username;

注意使用max() 这样可以保证即使没有匹配项,也将返回一行。

使用IF条件,CASE表达式仅用于SELECT语句

case用在sql中。 您需要在查询之外使用if。

你的问题(如其他答案中所述)是你不能使用像这样的case语句,if会更合适。

但是,您可以完全删除该条件语句以及局部变量:

CREATE PROC [dbo].[GetUserEULASelection] (@username VARCHAR(150))
AS
BEGIN

    SELECT COALESCE(a.NAME, '0') AS Name
    FROM licmn_license_users_accounts_c ua
    JOIN accounts a ON a.id = ua.licmn_license_users_accountsaccounts_ida
    JOIN licmn_license_users lu ON lu.id = licmn_license_users_accountslicmn_license_users_idb
    WHERE lu.username = @username;    

END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM