不同的方法为SQL中的变量赋值

时间:2013-08-01 08:21:31

标签: sql-server sql-server-2008

我可以用其他方式编写以下查询吗?

ALTER PROC Proc_AssetManagement_SubscriptionCheck @IMEINumber NVARCHAR(100)
,@PhoneNo NVARCHAR(200)
,@SIMNo NVARCHAR(100)
,@Id INT
,@Message NVARCHAR(MAX) OUTPUT
AS
BEGIN

DECLARE @SimMessage NVARCHAR(200) = ''
DECLARE @PhoneMessage NVARCHAR(200) = ''
SET @Message = ''

SELECT @Message = (
        CASE 
            WHEN COUNT(IMEINumber) > 0
                THEN ('IMEI Already Exists\n')
            ELSE ' '
            END
        )
FROM tblAssetSubscriptionDetails
WHERE AssetMgmtId <> @Id
    AND (IMEINumber = @IMEINumber)

SELECT @PhoneMessage = (
        CASE 
            WHEN COUNT(PhoneNo) > 0
                THEN ('PhoneNo Already Exists\n')
            ELSE ' '
            END
        )
FROM tblAssetSubscriptionDetails
WHERE AssetMgmtId <> @Id
    AND (PhoneNo = @PhoneNo)

SELECT @SimMessage = (
        CASE 
            WHEN COUNT(SimNo) > 0
                THEN ('SimNo Already Exists')
            ELSE ' '
            END
        )
FROM tblAssetSubscriptionDetails
WHERE AssetMgmtId <> @Id
    AND (SIMNo = @SIMNo)

SET @Message = @Message + '' + @PhoneMessage + '' + @SimMessage
END

我想减少查询数量,并希望在单个查询中获取消息,而不是3个不同的查询。我可以做吗?如果是这样呢? 我的目的是希望得到这样的信息。

如果在表格中找到IMEINumber,则表明IMEI号码已经存在。 如果在表格中找到SIm No以及IMEINumber,那么它将显示IMEI编号已经存在\ nSim否已存在等等...

1 个答案:

答案 0 :(得分:1)

这是否符合您的需求? (使用CTE:http://msdn.microsoft.com/en-us/library/ms175972.aspx。我在Notepad ++中部分编写了它,所以我希望没有语法错误。)

CTE tASD(代表tblAssetSubscriptionDetails)仅收集有用的行。 EXISTS通常应优于Count() > 0,因为它实际上并不需要计算所有内容。

WITH tASD(AssetMgmtId, IMEINumber, PhoneNo, SIMNo)
AS
(
    SELECT AssetMgmtId, IMEINumber, PhoneNo, SIMNo
    FROM tblAssetSubscriptionDetails
        WHERE AssetMgmtId <> @Id
            AND
            (
                IMEINumber = @IMEINumber
                OR PhoneNo = @PhoneNo
                OR SIMNo = @SIMNo
            )

)
SELECT @Message = (
        CASE 
            WHEN EXISTS (SELECT null FROM tASD WHERE IMEINumber = @IMEINumber)
                THEN ('IMEI Already Exists\n')
            ELSE ''
            END
        )
        +
        CASE 
            WHEN EXISTS (SELECT null FROM tASD WHERE PhoneNo = @PhoneNo)
                THEN ('PhoneNo Already Exists\n')
            ELSE ''
            END
        )
        +
        CASE 
            WHEN EXISTS (SELECT null FROM tASD WHERE SIMNo = @SIMNo)
                THEN ('SimNo Already Exists')
            ELSE ''
            END
        )