在SQL Server 2005中建议一些密集CURSOR操作的替代方法

时间:2010-12-16 07:35:12

标签: sql sql-server sql-server-2005

我正在遍历搜索SKU的产品数据集,其中产品名称的前6个字符与sku @itemno相同,然后将它们连接成CSV字符串,以用作要上传到数据集的数据集的一部分电子商务平台。以下是相关操作:

DECLARE c1 CURSOR READ_ONLY
FOR
SELECT sku FROM tbl WHERE name LIKE (SELECT LEFT(name,6) FROM tbl WHERE sku = @itemno) + '%'

OPEN c1
FETCH NEXT FROM c1
INTO @c1
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @associated = @associated + @c1 + ','
    FETCH NEXT FROM c1
    INTO @c1
END

你可以想象,考虑到15,000多条记录的数据集大小,这是非常缓慢的。当然有一种更优雅的方式来使用PIVOT或其他东西吗?

2 个答案:

答案 0 :(得分:3)

SQL Server 2005以后:

select 
  stuff( 
     (select ', ' + sku  
     from tbl 
     WHERE name LIKE (SELECT LEFT(name,6) FROM tbl WHERE sku = @itemno) + '%' 
     for xml path('') 
     ) 
   , 1, 2, '') as namelist;

答案 1 :(得分:3)

尝试类似

的内容
DECLARE @Val VARCHAR(MAX)
SELECT  @Val = COALESCE(@Val + ',','') + sku 
FROM    tbl 
WHERE   name LIKE   (
                        SELECT  LEFT(name,6) 
                        FROM    tbl 
                        WHERE   sku = @itemno) + '%'