Sql server 2008 如何在SQL Server存储过程中使用if exist进行while循环?

Sql server 2008 如何在SQL Server存储过程中使用if exist进行while循环?,sql-server-2008,stored-procedures,Sql Server 2008,Stored Procedures,我正在学习在存储过程中使用while循环,我不知道为什么存储过程不返回任何值 我正在使用if-exist检查表中是否存在id。 如果有超过1个id,我需要再次执行相同的查询 我尝试使用while循环,但它不起作用 我将@keyValue声明为Varchar,它会导致错误 将varchar值“c29dc109b310479fa5c281eb20c61656”转换为数据类型int时,转换失败 这就是为什么我在WHILE IF EXISTS (SELECT t1.ref_id

我正在学习在存储过程中使用while循环,我不知道为什么存储过程不返回任何值

我正在使用if-exist检查表中是否存在id。 如果有超过1个id,我需要再次执行相同的查询

我尝试使用while循环,但它不起作用

我将
@keyValue
声明为
Varchar
,它会导致错误

将varchar值“c29dc109b310479fa5c281eb20c61656”转换为数据类型int时,转换失败

这就是为什么我在
WHILE

IF EXISTS (SELECT t1.ref_id 
           FROM pbosproinvoiceitem t1 
           WHERE t1.ref_id = @keyValue)
    WHILE COUNT(@keyValue) > 1
    BEGIN
        --need to do for loop
        SELECT @balWghtSso = (SELECT t1.act_wght  
                              FROM ccossoitem t1 
                              WHERE t1.master_id = @keyValue) - 
                             (SELECT t1.wght 
                              FROM ccossoitem t1 
                              WHERE t1.master_id = @keyValue)
        SELECT @balWghtBl = (SELECT t1.act_wght 
                             FROM ccosblitem t1 
                             WHERE t1.master_id = @keyValue) - 
                            (SELECT t1.wght 
                             FROM ccosblitem t1 
                             WHERE t1.master_id = @keyValue)

        SELECT DISTINCT 
            t1.debtor_code AS customer_code, t1.tml_code, t1.scn, 
            t2.cg_type, t3.qty, @balWghtSso AS mea, t3.vol,
            CASE 
               WHEN t3.from_loc = 'DL' THEN 1 ELSE 0 
            END AS ex_wharf,
            t2.dg_flg, 0 AS conveyor_ind, t1.sso_num AS ref_doc_num,
            t1.id AS ref_id
        FROM 
            ccosso t1
        INNER JOIN 
            ccossoitem t2 ON t1.id = t2.master_id
        INNER JOIN 
            ccosgodown t3 ON t3.blso_id = t1.id AND t3.blso_item_id = t2.id
        WHERE 
            t3.move_type = 'LOAD'
            AND t1.id = @keyValue

        UNION ALL

        SELECT DISTINCT 
            t1.debtor_code AS customer_code, t1.tml_code, t1.scn, 
            t2.cg_type, t3.qty, 
            @balWghtBl AS mea, t3.vol, 
            CASE 
               WHEN t3.from_loc = 'DD' THEN 1 ELSE 0 
            END AS ex_wharf,
            t2.dg_flg, 0 AS conveyor_ind, t1.bl_num AS ref_doc_num,
            t1.id AS ref_id
        FROM 
            ccosbl t1
        INNER JOIN 
            ccosblitem t2 ON t1.id = t2.master_id
        INNER JOIN 
            ccosgodown t3 ON t3.blso_id = t1.id AND t3.blso_item_id = t2.id
        WHERE 
            t3.move_type = 'DELV'
            AND t1.id = @keyValue
    END;

您必须像下面那样重新编写while循环,并删除IF exists条件

WHILE( SELECT COUNT(1) 
FROM pbosproinvoiceitem t1 
WHERE t1.ref_id = @keyValue > 1)

请不要使用不适用于您的问题的标记。我删除了数据库标签,因为不清楚您实际使用的是哪一个。请仅添加您实际使用的数据库的标记我正在使用sql server 2008