0

私はテーブルを持っていますCompaniesdata

CREATE TABLE [dbo].[Companiesdata]
(
[Company Name] nvarchar(255),
[Industry] varchar(40),
[ParentId] int NULL,
)

行は

CompanyName               Industry          Parent ID  
--------------------------------------------------------
Xyz technologies          Software             1
apple Technologies        software             1
Sun network               media                2
abc Technologies          advertising          4
PQR Technnologies         Marketing            5
abc Technologies          Media                4

別のテーブルがあります

create table dbo.companiesss
(
autoid int identity(1,1),
companyname varchar(max),
Industry  varchar(max)
)

私はこのような手順を書きました:

create proc pr_getlistofcompaniesss (@tparentid varchar(20))   
as 
begin
   insert into dbo.companiesss(companyname, industry) 
      select  
          [CompanyName], [Industry] 
      from 
          [Companiesdata]
      where 
          parentid in (select items from dbo.split(@tparentid,',')) 
      except
      select company name, industry 
      from dbo.companiesss 
end

出力は次のとおりです。

pr_getlistofcompaniesss 1,2,4

行は次のように表示されます

AutoID    Company name              Industry
---------------------------------------------------
  1       apple Technologies        software
  2       Sun network               Media
  3       xyz Technologies          software
  4       abc Technologies          advertising
  5       abc technologies          media

代わりに、私の出力は次のようになります。

pr_getlistofcompaniesss 1,2,4

AutoID    Company name              Industry
---------------------------------------------------
  1       apple Technologies        software
  2       Sun network               Media
  3       xyz Technologies          software
  4       abc Technologies          advertising,media

つまり、同じ会社(ここabc technologies)で異なる業界名を使用している場合、業界フィールドはコンマで区切って、同じ行にレコードを表示する必要があります。つまり、(advertising, media

4

2 に答える 2

0

まず、これらの ID を個別のパラメーターとしてではなく、文字列で一緒に渡す必要があります。プロシージャは 1 つのパラメーターのみを受け入れます。

pr_getlistofcompaniesss '1,2,4'

次に、手順で、insert 句を以下のように更新します。これにより、業種がコンマで区切られた 1 つの文字列に連結されます。

insert into dbo.companiesss(companyname,industry) 
select [CompanyName],
       STUFF((select distinct ',' + [Industry]
              from [Companiesdata] as child
              where child.parentid = parent.parentid
              for xml path ('')),
             1, 2, '')
from [Companiesdata] as parent
join dbo.split(@tparentid,',')
    on (parent.parentid = split.items)

また、結合は一般的にはるかに高速に実行されるため、構文をjoin使用するのではなく使用しています。where ... in ( ... )

于 2012-08-08T12:05:15.187 に答える
0

同様の結果を得るためにスカラー関数を作成し、その関数をストアド プロシージャにクロス適用しました。コードは以下のとおりです。

CREATE  FUNCTION [dbo].[fnListIndustry] (@ParentID varchar(10))
RETURNS VARCHAR(1000)
AS
BEGIN 
DECLARE @IndustryList   varchar(1000)
SELECT  @IndustryList   = COALESCE(@IndustryList + ',', '') + rtrim(dbo.Companiesdata.Industry)
FROM    dbo.Companiesdata 
WHERE   dbo.Companiesdata.parenid = @ParentID

RETURN  @IndustryList
END
于 2012-08-08T11:53:16.410 に答える