2017-04-03 83 views
0

我只是学习在存储过程中使用while循环我不知道为什么存储过程不会返回任何值。如何在while循环中存在SQL Server存储过程?

我使用if exists来检查id是否存在于表中。 如果有多个ID我需要再次执行相同的查询。

我试过使用while循环和它不工作。

我声明@keyValue作为Varchar和它导致错误转换VARCHAR值“c29dc109b310479fa5c281eb20c61656”为数据类型int时

转换失败。

这就是为什么我用COUNTWHILE

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; 
+0

请不要使用不适用于您的问题的标签。我删除了数据库标记,因为它不清楚你实际使用了哪一个。请添加*的标签*您实际使用的数据库 –

+0

我使用的是sql server 2008 – hunt

回答

0

你必须重新写你的while循环如下图所示,取下是否存在条件。

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

@hunt,做了这项工作吗? –