Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2级组件项目编号放入逗号分隔的列表中。另外,游标被命名为@outside\u cursor,因为我一直试图通过创建嵌套游标来解决这个问题,但从未重命名它。好的,游标没有嵌套很好,我上面的建议如何?您似乎没有正确使用光标。我认为您需要加载所有itemno的数_Sql Server_Sql Server 2008_Tsql_Stored Procedures_Cursor - Fatal编程技术网

Sql server 2级组件项目编号放入逗号分隔的列表中。另外,游标被命名为@outside\u cursor,因为我一直试图通过创建嵌套游标来解决这个问题,但从未重命名它。好的,游标没有嵌套很好,我上面的建议如何?您似乎没有正确使用光标。我认为您需要加载所有itemno的数

Sql server 2级组件项目编号放入逗号分隔的列表中。另外,游标被命名为@outside\u cursor,因为我一直试图通过创建嵌套游标来解决这个问题,但从未重命名它。好的,游标没有嵌套很好,我上面的建议如何?您似乎没有正确使用光标。我认为您需要加载所有itemno的数,sql-server,sql-server-2008,tsql,stored-procedures,cursor,Sql Server,Sql Server 2008,Tsql,Stored Procedures,Cursor,2级组件项目编号放入逗号分隔的列表中。另外,游标被命名为@outside\u cursor,因为我一直试图通过创建嵌套游标来解决这个问题,但从未重命名它。好的,游标没有嵌套很好,我上面的建议如何?您似乎没有正确使用光标。我认为您需要加载所有itemno的数据集,然后逐个处理它。。。有意义吗?您所描述的最终是我想要的结果,但如果不在CTE中使用变量,我无法找出返回数据所使用的正确语法。我将尝试您的建议,并执行SP open,在定义和运行游标遍历行之前,将所有数据插入临时表。我会回来报告-谢谢你的建


2级组件项目编号放入逗号分隔的列表中。另外,游标被命名为
@outside\u cursor
,因为我一直试图通过创建嵌套游标来解决这个问题,但从未重命名它。好的,游标没有嵌套很好,我上面的建议如何?您似乎没有正确使用光标。我认为您需要加载所有itemno的数据集,然后逐个处理它。。。有意义吗?您所描述的最终是我想要的结果,但如果不在CTE中使用变量,我无法找出返回数据所使用的正确语法。我将尝试您的建议,并执行SP open,在定义和运行游标遍历行之前,将所有数据插入临时表。我会回来报告-谢谢你的建议。只要试着简化CTE,让它返回所有item_no的数据(基本上从语法中删除@itemno),然后从CTE中选择*,看看你有什么。您应该看到许多行可以加载到光标中。让我知道这是否有效…我感谢你在米兰的帮助。我不用光标就能完成这项工作。
CREATE PROCEDURE dbo.usp_BuildBOMLit
@item_no CHAR(8) = NULL 
AS 
BEGIN
WITH CTE AS (
        SELECT DISTINCT
            LTRIM(RTRIM(lvl1.item_no)) as item_no, LTRIM(RTRIM(lvl1.comp_item_no)) as comp_item_no,
            CASE
                WHEN LTRIM(RTRIM(lvl1.comp_item_no)) LIKE '.%' 
                    THEN 
                        LTRIM(RTRIM(lvl1.comp_item_no))
                WHEN LTRIM(RTRIM(lvl1.comp_item_no)) LIKE 'E%' 
                    THEN
                        (SELECT TOP 1 LTRIM(RTRIM(comp_item_no)) FROM bmprdstr_sql WHERE LTRIM(RTRIM(item_no))=LTRIM(RTRIM(lvl1.comp_item_no))  AND LTRIM(RTRIM(comp_item_no)) LIKE '.%')
                WHEN LTRIM(RTRIM(lvl1.comp_item_no)) LIKE 'ZG%'
                    THEN 
                        (SELECT TOP 1 LTRIM(RTRIM(comp_item_no)) FROM bmprdstr_sql WHERE LTRIM(RTRIM(item_no))=LTRIM(RTRIM(lvl1.comp_item_no))  AND LTRIM(RTRIM(comp_item_no)) LIKE '.%')
                    ELSE
                        NULL
            END as lvl_2_comp_item_no
        FROM 
            bmprdstr_sql as lvl1 
            LEFT JOIN bmprdstr_sql lvl2 ON lvl1.comp_item_no=lvl2.item_no
        WHERE 
            (lvl1.item_no = @item_no)
            AND (lvl1.comp_item_no LIKE '.%' OR lvl1.comp_item_no LIKE 'ZG%' OR lvl1.comp_item_no LIKE 'E%')
    )
    SELECT DISTINCT
        CASE
            WHEN LEFT(item_no,1)='.'
                THEN STUFF(item_no,1,1,'')
            ELSE
                item_no
        END as item_no,
        part_no = 
            STUFF((SELECT DISTINCT ',' + 
                    CASE
                        WHEN LEFT(lvl_2_comp_item_no,1)='.'
                            THEN STUFF(lvl_2_comp_item_no,1,1,'')
                        ELSE lvl_2_comp_item_no
                        END
                    FROM CTE where item_no=@item_no FOR XML PATH('')),1,1,'')
    FROM
        CTE
    WHERE
        lvl_2_comp_item_no IS NOT NULL AND item_no IS NOT NULL
END
 SET NOCOUNT ON;
 DECLARE @itemno CHAR(15);
 DECLARE @partno VARCHAR(254);
 DECLARE @outside_cursor AS CURSOR;

SET @outside_cursor = CURSOR FAST_FORWARD FOR 
WITH CTE AS
(SELECT DISTINCT 
        LTRIM(RTRIM(lvl1.item_no)) AS item_no,
        LTRIM(RTRIM(lvl1.comp_item_no)) AS comp_item_no,
        CASE
            WHEN LTRIM(RTRIM(lvl1.comp_item_no)) LIKE '.%' 
                THEN LTRIM(RTRIM(lvl1.comp_item_no))
            WHEN LTRIM(RTRIM(lvl1.comp_item_no)) LIKE 'E%' 
                THEN
                    (SELECT TOP 1 
                        LTRIM(RTRIM(comp_item_no))
                    FROM 
                        bmprdstr_sql
                    WHERE 

LTRIM(RTRIM(item_no))=LTRIM(RTRIM(lvl1.comp_item_no))
                        AND LTRIM(RTRIM(comp_item_no)) LIKE '.%'
                    )
            WHEN LTRIM(RTRIM(lvl1.comp_item_no)) LIKE 'ZG%' 
                THEN
                    (SELECT TOP 1 
                        LTRIM(RTRIM(comp_item_no))
                    FROM 
                        bmprdstr_sql
                    WHERE 

LTRIM(RTRIM(item_no))=LTRIM(RTRIM(lvl1.comp_item_no))
                        AND LTRIM(RTRIM(comp_item_no)) LIKE '.%'
                    )
            ELSE NULL
        END AS lvl_2_comp_item_no
 FROM 
    bmprdstr_sql AS lvl1
    LEFT JOIN bmprdstr_sql lvl2 ON lvl1.comp_item_no=lvl2.item_no
 WHERE 
    (lvl1.item_no = @itemno) -- <-- problem
     AND (lvl1.comp_item_no LIKE '.%' OR lvl1.comp_item_no LIKE 'ZG%' 
OR lvl1.comp_item_no LIKE 'E%')
)
SELECT DISTINCT 
    CASE
        WHEN LEFT(item_no,1)='.' 
            THEN STUFF(item_no,1,1,'')
        ELSE item_no
    END AS item_no,
    part_no = 
        STUFF(
            (SELECT DISTINCT ',' + 
                CASE 
                    WHEN LEFT(lvl_2_comp_item_no,1)='.' 
                        THEN STUFF(lvl_2_comp_item_no,1,1,'') 
                    ELSE lvl_2_comp_item_no 
                END
            FROM 
                CTE
            WHERE 
                item_no=@itemno FOR XML PATH('')),1,1,'') 
                     -- ^ problem
FROM 
    CTE
WHERE 
    lvl_2_comp_item_no IS NOT NULL
    AND item_no IS NOT NULL 

OPEN @outside_cursor;
FETCH NEXT FROM @outside_cursor INTO @itemno, @partno;

WHILE @@FETCH_STATUS = 0 
    BEGIN
        INSERT INTO items_parts (item_no, part_no)
        VALUES (@itemno, @partno) 
    FETCH NEXT FROM @outside_cursor INTO @itemno,  @partno 
    END 
CLOSE @outside_cursor 
DEALLOCATE @outside_cursor
    CTE(item_no, comp_item_no, lvl_2_comp_item_no) 
      AS (
            --.... and the row will correspond to the @itemno provided
FETCH NEXT FROM @outside_cursor INTO @itemno, @partno...