1

私は 2 つのテイルズ レシピとパラメーターを持っています。Recipes テーブルには、同じレシピ名を持つ複数のバージョンが含まれています。パラメータ テーブルには、1 つのレシピに対して複数のパラメータ名が含まれています。レシピ名とパラメーター名で同じレシピと同じパラメーター グループに定数 GUID を更新するにはどうすればよいですか?

CREATE TABLE [dbo].[Recipe](
    [VersionGUID] [varchar](36) NULL,
    [Name] [nvarchar](50) NULL
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Parameter](
    [ParameterGUID] [varchar](36) NULL,
    [VersionGUID] [varchar](36) NULL,
    [ParameterName] [nvarchar](50) NULL,
    [ConstantGUID] [varchar](50) NULL
) ON [PRIMARY]

GO


-- Add 5 rows to [dbo].[Parameter]
INSERT INTO [dbo].[Parameter] ([ParameterGUID], [VersionGUID], [ParameterName], [ConstantGUID]) VALUES ('1B00E5ED-25A5-4FEA-AE73-14CDC7871951', 'AB00E5ED-25A5-4FEA-AE73-14CDC787195A', N'Parameter1', '26976642-12B6-462A-982B-74448DDA33B6')
INSERT INTO [dbo].[Parameter] ([ParameterGUID], [VersionGUID], [ParameterName], [ConstantGUID]) VALUES ('5AD70E77-E377-4661-A525-6711A1992217', '8B00E5ED-25A5-4FEA-AE73-14CDC7871953', N'Parameter1', '55D724C5-51A6-48B7-9161-2364F004BB7F')
INSERT INTO [dbo].[Parameter] ([ParameterGUID], [VersionGUID], [ParameterName], [ConstantGUID]) VALUES ('A0142B6A-52F6-4A49-ADBA-DC5D4C2BEF7A', '20142B6A-52F6-4A49-ADBA-DC5D4C2BEF71', N'Parameter2', 'B5903A3D-B606-49DD-A75C-A1B29740EBEB')
INSERT INTO [dbo].[Parameter] ([ParameterGUID], [VersionGUID], [ParameterName], [ConstantGUID]) VALUES ('A96113F9-1046-4E35-B320-BE3126D522CF', '20142B6A-52F6-4A49-ADBA-DC5D4C2BEF71', N'Parameter1', '108197E8-47CA-477C-B97F-4BF0321C1D91')
INSERT INTO [dbo].[Parameter] ([ParameterGUID], [VersionGUID], [ParameterName], [ConstantGUID]) VALUES ('AB00E5ED-25A5-4FEA-AE73-14CDC787195A', '8B00E5ED-25A5-4FEA-AE73-14CDC7871953', N'Parameter2', 'B3AC6268-6257-4E3B-B0C9-4418E4A09E40')

-- Add 3 rows to [dbo].[Recipe] with non-unique comparison key
SET ROWCOUNT 1
INSERT INTO [dbo].[Recipe] ([VersionGUID], [Name]) VALUES ('20142B6A-52F6-4A49-ADBA-DC5D4C2BEF71', N'Recipe1')
INSERT INTO [dbo].[Recipe] ([VersionGUID], [Name]) VALUES ('8B00E5ED-25A5-4FEA-AE73-14CDC7871953', N'Recipe1')
INSERT INTO [dbo].[Recipe] ([VersionGUID], [Name]) VALUES ('AB00E5ED-25A5-4FEA-AE73-14CDC787195A', N'Recipe2')
SET ROWCOUNT 0

次のクエリを実行すると、同じになりたい108197E8-47CA-477C-B97F-4BF0321C1D91と思います55D724C5-51A6-48B7-9161-2364F004BB7F。同じであるなどB3AC6268-6257-4E3B-B0C9-4418E4A09E40B5903A3D-B606-49DD-A75C-A1B29740EBEB500万件の記録を更新しています。

select name+parametername as name_parametername,name as RecipeName,parametername,constantguid,Parameter.parameterguid
from dbo.Recipe,dbo.Parameter
where dbo.Recipe.versionguid=dbo.Parameter.versionguid
order by name_parametername

前もって感謝します。

4

2 に答える 2

0

ありがとうボグダン。あなたは大きな助けです。

既存のパラメーター テーブルに UniqueRcipeParameterName を追加しました。すべてのバージョンでレシピ名とパラメータ名の組み合わせが同じになるためです。

PRINT N'Updating Recipe Parameters ConstantGUID...'

ALTER TABLE Parameter
ADD UniqueRecipeParameter NVARCHAR(600) NULL;
GO

ALTER TABLE Parameter
ADD IsPhase bit NULL ;
GO

UPDATE  Parameters
SET     UniqueRecipeParameter = Recipe.Name + '-' + Parameter.Name,
        IsPhase = 0
FROM    Recipe,
        Parameter
WHERE   Recipe.VersionGUID = Parameter.VersionGUID

DECLARE @GUIDs TABLE
    (
      --Assuming Recipe Name and Parameter Name will not exit 450 characters. The maximum key length is 900 bytes which is 450
      UniqueRecipeParameter NVARCHAR(450) PRIMARY KEY ,
      NewGUID UNIQUEIDENTIFIER DEFAULT NEWID()
    ) ;

INSERT  @GUIDs
        ( UniqueRecipeParameter
        )
        SELECT  UniqueRecipeParameter
        FROM    ( SELECT DISTINCT
                            UniqueRecipeParameter
                  FROM      Parameter
                  WHERE     Parameter.IsPhase = 0  
                ) a ;

UPDATE  x
SET     ConstantGUID = y.NewGUID
FROM    dbo.Parameter x
        INNER JOIN @GUIDs y ON x.UniqueRecipeParameter = y.UniqueRecipeParameter ;

PRINT N'Cleaning up...'
ALTER TABLE Parameter
DROP COLUMN UniqueRecipeParameter;
GO

ALTER TABLE Parameter
DROP COLUMN IsPhase;
GO

オフラインのアップグレードなので、3と4はスキップできます。

再度、感謝します。できます。

于 2013-07-31T21:11:05.247 に答える