From 175c586209d2bc175e5499fd8550999bde618553 Mon Sep 17 00:00:00 2001 From: Thierry Schork Date: Wed, 23 Aug 2023 14:53:26 +0200 Subject: [PATCH] sync --- CUST - revert objects to dbo.sql | 18 + ...ndexes and statistics without hciTools.sql | 2718 +++++++++++++++++ OCTPDBA-713 - global blue/deploy.sql | 700 +++++ 3 files changed, 3436 insertions(+) create mode 100644 CUST - revert objects to dbo.sql create mode 100644 EXPLOIT - maintain indexes and statistics without hciTools.sql create mode 100644 OCTPDBA-713 - global blue/deploy.sql diff --git a/CUST - revert objects to dbo.sql b/CUST - revert objects to dbo.sql new file mode 100644 index 0000000..0bfee92 --- /dev/null +++ b/CUST - revert objects to dbo.sql @@ -0,0 +1,18 @@ +--- GCMPRDCENT +USE [ArizonaCUST] + +--ALTER SCHEMA [dbo] TRANSFER [del].[FAKTURO_KPI_1] +SELECT COUNT(1) +FROM dbo.[FAKTURO_KPI_1] + +RETURN + +ALTER SCHEMA [dbo] TRANSFER [del].[FAKTURO_KPI_1] + +ALTER SCHEMA [dbo] TRANSFER [del].[AP_Cent_Load] +ALTER SCHEMA [dbo] TRANSFER [del].[CRSH_Cent_Load] +ALTER SCHEMA [dbo] TRANSFER [del].[CRMCRD_Cent] +ALTER SCHEMA [dbo] TRANSFER [del].[CRSO_Cent] +ALTER SCHEMA [dbo] TRANSFER [del].[AP_Cent] +ALTER SCHEMA [dbo] TRANSFER [del].[CRSH_Cent] +ALTER SCHEMA [dbo] TRANSFER [del].[CUST_Item_for_Rowa] \ No newline at end of file diff --git a/EXPLOIT - maintain indexes and statistics without hciTools.sql b/EXPLOIT - maintain indexes and statistics without hciTools.sql new file mode 100644 index 0000000..23cfa44 --- /dev/null +++ b/EXPLOIT - maintain indexes and statistics without hciTools.sql @@ -0,0 +1,2718 @@ +USE master +GO + +/* +Standalone script to start a Ola Hallengreen indexOptimize without having HCITools + +Create the needed procs and start index maintenance with statistics rebuild, then drop the created procs. +*/ + +IF OBJECT_ID('dbo.CommandExecute') IS NULL +BEGIN + EXEC(' + CREATE PROCEDURE [dbo].[CommandExecute] + AS + BEGIN + PRINT ''stub'' + END + '); +END +GO + + + + +/****** Object: StoredProcedure [dbo].[CommandExecute] Script Date: 13.07.2023 17:10:12 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + +ALTER PROCEDURE [dbo].[CommandExecute] + +@DatabaseContext nvarchar(max), +@Command nvarchar(max), +@CommandType nvarchar(max), +@Mode int, +@Comment nvarchar(max) = NULL, +@DatabaseName nvarchar(max) = NULL, +@SchemaName nvarchar(max) = NULL, +@ObjectName nvarchar(max) = NULL, +@ObjectType nvarchar(max) = NULL, +@IndexName nvarchar(max) = NULL, +@IndexType int = NULL, +@StatisticsName nvarchar(max) = NULL, +@PartitionNumber int = NULL, +@ExtendedInfo xml = NULL, +@LockMessageSeverity int = 16, +@LogToTable nvarchar(max), +@Execute nvarchar(max) + +AS + +BEGIN + + ---------------------------------------------------------------------------------------------------- + --// Source: https://ola.hallengren.com //-- + --// License: https://ola.hallengren.com/license.html //-- + --// GitHub: https://github.com/olahallengren/sql-server-maintenance-solution //-- + --// Version: 2020-11-15 18:44:03 //-- + ---------------------------------------------------------------------------------------------------- + + SET NOCOUNT ON + + DECLARE @StartMessage nvarchar(max) + DECLARE @EndMessage nvarchar(max) + DECLARE @ErrorMessage nvarchar(max) + DECLARE @ErrorMessageOriginal nvarchar(max) + DECLARE @Severity int + + DECLARE @Errors TABLE (ID int IDENTITY PRIMARY KEY, + [Message] nvarchar(max) NOT NULL, + Severity int NOT NULL, + [State] int) + + DECLARE @CurrentMessage nvarchar(max) + DECLARE @CurrentSeverity int + DECLARE @CurrentState int + + DECLARE @sp_executesql nvarchar(max) = QUOTENAME(@DatabaseContext) + '.sys.sp_executesql' + + DECLARE @StartTime datetime2 + DECLARE @EndTime datetime2 + + DECLARE @ID int + + DECLARE @Error int = 0 + DECLARE @ReturnCode int = 0 + + DECLARE @EmptyLine nvarchar(max) = CHAR(9) + + ---------------------------------------------------------------------------------------------------- + --// Check core requirements //-- + ---------------------------------------------------------------------------------------------------- + + IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.', 16, 1 + END + + IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'ANSI_NULLS has to be set to ON for the stored procedure.', 16, 1 + END + + IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.', 16, 1 + END + + IF @LogToTable = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandLog') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The table CommandLog is missing. Download https://ola.hallengren.com/scripts/CommandLog.sql.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Check input parameters //-- + ---------------------------------------------------------------------------------------------------- + + IF @DatabaseContext IS NULL OR NOT EXISTS (SELECT * FROM sys.databases WHERE name = @DatabaseContext) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabaseContext is not supported.', 16, 1 + END + + IF @Command IS NULL OR @Command = '' + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Command is not supported.', 16, 1 + END + + IF @CommandType IS NULL OR @CommandType = '' OR LEN(@CommandType) > 60 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @CommandType is not supported.', 16, 1 + END + + IF @Mode NOT IN(1,2) OR @Mode IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Mode is not supported.', 16, 1 + END + + IF @LockMessageSeverity NOT IN(10,16) OR @LockMessageSeverity IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LockMessageSeverity is not supported.', 16, 1 + END + + IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LogToTable is not supported.', 16, 1 + END + + IF @Execute NOT IN('Y','N') OR @Execute IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Execute is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Raise errors //-- + ---------------------------------------------------------------------------------------------------- + + DECLARE ErrorCursor CURSOR FAST_FORWARD FOR SELECT [Message], Severity, [State] FROM @Errors ORDER BY [ID] ASC + + OPEN ErrorCursor + + FETCH ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState + + WHILE @@FETCH_STATUS = 0 + BEGIN + RAISERROR('%s', @CurrentSeverity, @CurrentState, @CurrentMessage) WITH NOWAIT + RAISERROR(@EmptyLine, 10, 1) WITH NOWAIT + + FETCH NEXT FROM ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState + END + + CLOSE ErrorCursor + + DEALLOCATE ErrorCursor + + IF EXISTS (SELECT * FROM @Errors WHERE Severity >= 16) + BEGIN + SET @ReturnCode = 50000 + GOTO ReturnCode + END + + ---------------------------------------------------------------------------------------------------- + --// Log initial information //-- + ---------------------------------------------------------------------------------------------------- + + SET @StartTime = SYSDATETIME() + + SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Database context: ' + QUOTENAME(@DatabaseContext) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Command: ' + @Command + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + IF @Comment IS NOT NULL + BEGIN + SET @StartMessage = 'Comment: ' + @Comment + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + END + + IF @LogToTable = 'Y' + BEGIN + INSERT INTO dbo.CommandLog (DatabaseName, SchemaName, ObjectName, ObjectType, IndexName, IndexType, StatisticsName, PartitionNumber, ExtendedInfo, CommandType, Command, StartTime) + VALUES (@DatabaseName, @SchemaName, @ObjectName, @ObjectType, @IndexName, @IndexType, @StatisticsName, @PartitionNumber, @ExtendedInfo, @CommandType, @Command, @StartTime) + END + + SET @ID = SCOPE_IDENTITY() + + ---------------------------------------------------------------------------------------------------- + --// Execute command //-- + ---------------------------------------------------------------------------------------------------- + + IF @Mode = 1 AND @Execute = 'Y' + BEGIN + EXECUTE @sp_executesql @stmt = @Command + SET @Error = @@ERROR + SET @ReturnCode = @Error + END + + IF @Mode = 2 AND @Execute = 'Y' + BEGIN + BEGIN TRY + EXECUTE @sp_executesql @stmt = @Command + END TRY + BEGIN CATCH + SET @Error = ERROR_NUMBER() + SET @ErrorMessageOriginal = ERROR_MESSAGE() + + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + END CATCH + END + + ---------------------------------------------------------------------------------------------------- + --// Log completing information //-- + ---------------------------------------------------------------------------------------------------- + + SET @EndTime = SYSDATETIME() + + SET @EndMessage = 'Outcome: ' + CASE WHEN @Execute = 'N' THEN 'Not Executed' WHEN @Error = 0 THEN 'Succeeded' ELSE 'Failed' END + RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT + + SET @EndMessage = 'Duration: ' + CASE WHEN (DATEDIFF(SECOND,@StartTime,@EndTime) / (24 * 3600)) > 0 THEN CAST((DATEDIFF(SECOND,@StartTime,@EndTime) / (24 * 3600)) AS nvarchar) + '.' ELSE '' END + CONVERT(nvarchar,DATEADD(SECOND,DATEDIFF(SECOND,@StartTime,@EndTime),'1900-01-01'),108) + RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT + + SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,@EndTime,120) + RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT + + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF @LogToTable = 'Y' + BEGIN + UPDATE dbo.CommandLog + SET EndTime = @EndTime, + ErrorNumber = CASE WHEN @Execute = 'N' THEN NULL ELSE @Error END, + ErrorMessage = @ErrorMessageOriginal + WHERE ID = @ID + END + + ReturnCode: + IF @ReturnCode <> 0 + BEGIN + RETURN @ReturnCode + END + + ---------------------------------------------------------------------------------------------------- + +END +GO + + +GO + +IF OBJECT_ID('dbo.IndexOptimize') IS NULL +BEGIN + EXEC(' + CREATE PROCEDURE [dbo].[IndexOptimize] + AS + BEGIN + PRINT ''stub'' + END + '); +END +GO + +/****** Object: StoredProcedure [dbo].[IndexOptimize] Script Date: 13.07.2023 17:05:47 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + + +ALTER PROCEDURE [dbo].[IndexOptimize] + +@Databases nvarchar(max) = NULL, +@FragmentationLow nvarchar(max) = NULL, +@FragmentationMedium nvarchar(max) = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', +@FragmentationHigh nvarchar(max) = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', +@FragmentationLevel1 int = 5, +@FragmentationLevel2 int = 30, +@MinNumberOfPages int = 1000, +@MaxNumberOfPages int = NULL, +@SortInTempdb nvarchar(max) = 'N', +@MaxDOP int = NULL, +@FillFactor int = NULL, +@PadIndex nvarchar(max) = NULL, +@LOBCompaction nvarchar(max) = 'Y', +@UpdateStatistics nvarchar(max) = NULL, +@OnlyModifiedStatistics nvarchar(max) = 'N', +@StatisticsModificationLevel int = NULL, +@StatisticsSample int = NULL, +@StatisticsResample nvarchar(max) = 'N', +@PartitionLevel nvarchar(max) = 'Y', +@MSShippedObjects nvarchar(max) = 'N', +@Indexes nvarchar(max) = NULL, +@TimeLimit int = NULL, +@Delay int = NULL, +@WaitAtLowPriorityMaxDuration int = NULL, +@WaitAtLowPriorityAbortAfterWait nvarchar(max) = NULL, +@Resumable nvarchar(max) = 'N', +@AvailabilityGroups nvarchar(max) = NULL, +@LockTimeout int = NULL, +@LockMessageSeverity int = 16, +@StringDelimiter nvarchar(max) = ',', +@DatabaseOrder nvarchar(max) = NULL, +@DatabasesInParallel nvarchar(max) = 'N', +@LogToTable nvarchar(max) = 'N', +@Execute nvarchar(max) = 'Y' + +AS + +BEGIN + + ---------------------------------------------------------------------------------------------------- + --// Source: https://ola.hallengren.com //-- + --// License: https://ola.hallengren.com/license.html //-- + --// GitHub: https://github.com/olahallengren/sql-server-maintenance-solution //-- + --// Version: 2020-11-15 18:44:03 //-- + ---------------------------------------------------------------------------------------------------- + + SET NOCOUNT ON + + SET ARITHABORT ON + + SET NUMERIC_ROUNDABORT OFF + + DECLARE @StartMessage nvarchar(max) + DECLARE @EndMessage nvarchar(max) + DECLARE @DatabaseMessage nvarchar(max) + DECLARE @ErrorMessage nvarchar(max) + DECLARE @Severity int + + DECLARE @StartTime datetime2 = SYSDATETIME() + DECLARE @SchemaName nvarchar(max) = OBJECT_SCHEMA_NAME(@@PROCID) + DECLARE @ObjectName nvarchar(max) = OBJECT_NAME(@@PROCID) + DECLARE @VersionTimestamp nvarchar(max) = SUBSTRING(OBJECT_DEFINITION(@@PROCID),CHARINDEX('--// Version: ',OBJECT_DEFINITION(@@PROCID)) + LEN('--// Version: ') + 1, 19) + DECLARE @Parameters nvarchar(max) + + DECLARE @HostPlatform nvarchar(max) + + DECLARE @PartitionLevelStatistics bit + + DECLARE @QueueID int + DECLARE @QueueStartTime datetime2 + + DECLARE @CurrentDBID int + DECLARE @CurrentDatabaseName nvarchar(max) + + DECLARE @CurrentDatabase_sp_executesql nvarchar(max) + + DECLARE @CurrentUserAccess nvarchar(max) + DECLARE @CurrentIsReadOnly bit + DECLARE @CurrentDatabaseState nvarchar(max) + DECLARE @CurrentInStandby bit + DECLARE @CurrentRecoveryModel nvarchar(max) + + DECLARE @CurrentIsDatabaseAccessible bit + DECLARE @CurrentAvailabilityGroup nvarchar(max) + DECLARE @CurrentAvailabilityGroupRole nvarchar(max) + DECLARE @CurrentDatabaseMirroringRole nvarchar(max) + + DECLARE @CurrentDatabaseContext nvarchar(max) + DECLARE @CurrentCommand nvarchar(max) + DECLARE @CurrentCommandOutput int + DECLARE @CurrentCommandType nvarchar(max) + DECLARE @CurrentComment nvarchar(max) + DECLARE @CurrentExtendedInfo xml + + DECLARE @Errors TABLE (ID int IDENTITY PRIMARY KEY, + [Message] nvarchar(max) NOT NULL, + Severity int NOT NULL, + [State] int) + + DECLARE @CurrentMessage nvarchar(max) + DECLARE @CurrentSeverity int + DECLARE @CurrentState int + + DECLARE @CurrentIxID int + DECLARE @CurrentIxOrder int + DECLARE @CurrentSchemaID int + DECLARE @CurrentSchemaName nvarchar(max) + DECLARE @CurrentObjectID int + DECLARE @CurrentObjectName nvarchar(max) + DECLARE @CurrentObjectType nvarchar(max) + DECLARE @CurrentIsMemoryOptimized bit + DECLARE @CurrentIndexID int + DECLARE @CurrentIndexName nvarchar(max) + DECLARE @CurrentIndexType int + DECLARE @CurrentStatisticsID int + DECLARE @CurrentStatisticsName nvarchar(max) + DECLARE @CurrentPartitionID bigint + DECLARE @CurrentPartitionNumber int + DECLARE @CurrentPartitionCount int + DECLARE @CurrentIsPartition bit + DECLARE @CurrentIndexExists bit + DECLARE @CurrentStatisticsExists bit + DECLARE @CurrentIsImageText bit + DECLARE @CurrentIsNewLOB bit + DECLARE @CurrentIsFileStream bit + DECLARE @CurrentIsColumnStore bit + DECLARE @CurrentIsComputed bit + DECLARE @CurrentIsTimestamp bit + DECLARE @CurrentAllowPageLocks bit + DECLARE @CurrentNoRecompute bit + DECLARE @CurrentIsIncremental bit + DECLARE @CurrentRowCount bigint + DECLARE @CurrentModificationCounter bigint + DECLARE @CurrentOnReadOnlyFileGroup bit + DECLARE @CurrentResumableIndexOperation bit + DECLARE @CurrentFragmentationLevel float + DECLARE @CurrentPageCount bigint + DECLARE @CurrentFragmentationGroup nvarchar(max) + DECLARE @CurrentAction nvarchar(max) + DECLARE @CurrentMaxDOP int + DECLARE @CurrentUpdateStatistics nvarchar(max) + DECLARE @CurrentStatisticsSample int + DECLARE @CurrentStatisticsResample nvarchar(max) + DECLARE @CurrentDelay datetime + + DECLARE @tmpDatabases TABLE (ID int IDENTITY, + DatabaseName nvarchar(max), + DatabaseType nvarchar(max), + AvailabilityGroup bit, + StartPosition int, + DatabaseSize bigint, + [Order] int, + Selected bit, + Completed bit, + PRIMARY KEY(Selected, Completed, [Order], ID)) + + DECLARE @tmpAvailabilityGroups TABLE (ID int IDENTITY PRIMARY KEY, + AvailabilityGroupName nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @tmpDatabasesAvailabilityGroups TABLE (DatabaseName nvarchar(max), + AvailabilityGroupName nvarchar(max)) + + DECLARE @tmpIndexesStatistics TABLE (ID int IDENTITY, + SchemaID int, + SchemaName nvarchar(max), + ObjectID int, + ObjectName nvarchar(max), + ObjectType nvarchar(max), + IsMemoryOptimized bit, + IndexID int, + IndexName nvarchar(max), + IndexType int, + AllowPageLocks bit, + IsImageText bit, + IsNewLOB bit, + IsFileStream bit, + IsColumnStore bit, + IsComputed bit, + IsTimestamp bit, + OnReadOnlyFileGroup bit, + ResumableIndexOperation bit, + StatisticsID int, + StatisticsName nvarchar(max), + [NoRecompute] bit, + IsIncremental bit, + PartitionID bigint, + PartitionNumber int, + PartitionCount int, + StartPosition int, + [Order] int, + Selected bit, + Completed bit, + PRIMARY KEY(Selected, Completed, [Order], ID)) + + DECLARE @SelectedDatabases TABLE (DatabaseName nvarchar(max), + DatabaseType nvarchar(max), + AvailabilityGroup nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @SelectedAvailabilityGroups TABLE (AvailabilityGroupName nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @SelectedIndexes TABLE (DatabaseName nvarchar(max), + SchemaName nvarchar(max), + ObjectName nvarchar(max), + IndexName nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @Actions TABLE ([Action] nvarchar(max)) + + INSERT INTO @Actions([Action]) VALUES('INDEX_REBUILD_ONLINE') + INSERT INTO @Actions([Action]) VALUES('INDEX_REBUILD_OFFLINE') + INSERT INTO @Actions([Action]) VALUES('INDEX_REORGANIZE') + + DECLARE @ActionsPreferred TABLE (FragmentationGroup nvarchar(max), + [Priority] int, + [Action] nvarchar(max)) + + DECLARE @CurrentActionsAllowed TABLE ([Action] nvarchar(max)) + + DECLARE @CurrentAlterIndexWithClauseArguments TABLE (ID int IDENTITY, + Argument nvarchar(max), + Added bit DEFAULT 0) + + DECLARE @CurrentAlterIndexArgumentID int + DECLARE @CurrentAlterIndexArgument nvarchar(max) + DECLARE @CurrentAlterIndexWithClause nvarchar(max) + + DECLARE @CurrentUpdateStatisticsWithClauseArguments TABLE (ID int IDENTITY, + Argument nvarchar(max), + Added bit DEFAULT 0) + + DECLARE @CurrentUpdateStatisticsArgumentID int + DECLARE @CurrentUpdateStatisticsArgument nvarchar(max) + DECLARE @CurrentUpdateStatisticsWithClause nvarchar(max) + + DECLARE @Error int = 0 + DECLARE @ReturnCode int = 0 + + DECLARE @EmptyLine nvarchar(max) = CHAR(9) + + DECLARE @Version numeric(18,10) = CAST(LEFT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - 1) + '.' + REPLACE(RIGHT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)), LEN(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)))),'.','') AS numeric(18,10)) + + IF @Version >= 14 + BEGIN + SELECT @HostPlatform = host_platform + FROM sys.dm_os_host_info + END + ELSE + BEGIN + SET @HostPlatform = 'Windows' + END + + DECLARE @AmazonRDS bit = CASE WHEN DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa' THEN 1 ELSE 0 END + + ---------------------------------------------------------------------------------------------------- + --// Log initial information //-- + ---------------------------------------------------------------------------------------------------- + + SET @Parameters = '@Databases = ' + ISNULL('''' + REPLACE(@Databases,'''','''''') + '''','NULL') + SET @Parameters += ', @FragmentationLow = ' + ISNULL('''' + REPLACE(@FragmentationLow,'''','''''') + '''','NULL') + SET @Parameters += ', @FragmentationMedium = ' + ISNULL('''' + REPLACE(@FragmentationMedium,'''','''''') + '''','NULL') + SET @Parameters += ', @FragmentationHigh = ' + ISNULL('''' + REPLACE(@FragmentationHigh,'''','''''') + '''','NULL') + SET @Parameters += ', @FragmentationLevel1 = ' + ISNULL(CAST(@FragmentationLevel1 AS nvarchar),'NULL') + SET @Parameters += ', @FragmentationLevel2 = ' + ISNULL(CAST(@FragmentationLevel2 AS nvarchar),'NULL') + SET @Parameters += ', @MinNumberOfPages = ' + ISNULL(CAST(@MinNumberOfPages AS nvarchar),'NULL') + SET @Parameters += ', @MaxNumberOfPages = ' + ISNULL(CAST(@MaxNumberOfPages AS nvarchar),'NULL') + SET @Parameters += ', @SortInTempdb = ' + ISNULL('''' + REPLACE(@SortInTempdb,'''','''''') + '''','NULL') + SET @Parameters += ', @MaxDOP = ' + ISNULL(CAST(@MaxDOP AS nvarchar),'NULL') + SET @Parameters += ', @FillFactor = ' + ISNULL(CAST(@FillFactor AS nvarchar),'NULL') + SET @Parameters += ', @PadIndex = ' + ISNULL('''' + REPLACE(@PadIndex,'''','''''') + '''','NULL') + SET @Parameters += ', @LOBCompaction = ' + ISNULL('''' + REPLACE(@LOBCompaction,'''','''''') + '''','NULL') + SET @Parameters += ', @UpdateStatistics = ' + ISNULL('''' + REPLACE(@UpdateStatistics,'''','''''') + '''','NULL') + SET @Parameters += ', @OnlyModifiedStatistics = ' + ISNULL('''' + REPLACE(@OnlyModifiedStatistics,'''','''''') + '''','NULL') + SET @Parameters += ', @StatisticsModificationLevel = ' + ISNULL(CAST(@StatisticsModificationLevel AS nvarchar),'NULL') + SET @Parameters += ', @StatisticsSample = ' + ISNULL(CAST(@StatisticsSample AS nvarchar),'NULL') + SET @Parameters += ', @StatisticsResample = ' + ISNULL('''' + REPLACE(@StatisticsResample,'''','''''') + '''','NULL') + SET @Parameters += ', @PartitionLevel = ' + ISNULL('''' + REPLACE(@PartitionLevel,'''','''''') + '''','NULL') + SET @Parameters += ', @MSShippedObjects = ' + ISNULL('''' + REPLACE(@MSShippedObjects,'''','''''') + '''','NULL') + SET @Parameters += ', @Indexes = ' + ISNULL('''' + REPLACE(@Indexes,'''','''''') + '''','NULL') + SET @Parameters += ', @TimeLimit = ' + ISNULL(CAST(@TimeLimit AS nvarchar),'NULL') + SET @Parameters += ', @Delay = ' + ISNULL(CAST(@Delay AS nvarchar),'NULL') + SET @Parameters += ', @WaitAtLowPriorityMaxDuration = ' + ISNULL(CAST(@WaitAtLowPriorityMaxDuration AS nvarchar),'NULL') + SET @Parameters += ', @WaitAtLowPriorityAbortAfterWait = ' + ISNULL('''' + REPLACE(@WaitAtLowPriorityAbortAfterWait,'''','''''') + '''','NULL') + SET @Parameters += ', @Resumable = ' + ISNULL('''' + REPLACE(@Resumable,'''','''''') + '''','NULL') + SET @Parameters += ', @AvailabilityGroups = ' + ISNULL('''' + REPLACE(@AvailabilityGroups,'''','''''') + '''','NULL') + SET @Parameters += ', @LockTimeout = ' + ISNULL(CAST(@LockTimeout AS nvarchar),'NULL') + SET @Parameters += ', @LockMessageSeverity = ' + ISNULL(CAST(@LockMessageSeverity AS nvarchar),'NULL') + SET @Parameters += ', @StringDelimiter = ' + ISNULL('''' + REPLACE(@StringDelimiter,'''','''''') + '''','NULL') + SET @Parameters += ', @DatabaseOrder = ' + ISNULL('''' + REPLACE(@DatabaseOrder,'''','''''') + '''','NULL') + SET @Parameters += ', @DatabasesInParallel = ' + ISNULL('''' + REPLACE(@DatabasesInParallel,'''','''''') + '''','NULL') + SET @Parameters += ', @LogToTable = ' + ISNULL('''' + REPLACE(@LogToTable,'''','''''') + '''','NULL') + SET @Parameters += ', @Execute = ' + ISNULL('''' + REPLACE(@Execute,'''','''''') + '''','NULL') + + SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Server: ' + CAST(SERVERPROPERTY('ServerName') AS nvarchar(max)) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Version: ' + CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Edition: ' + CAST(SERVERPROPERTY('Edition') AS nvarchar(max)) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Platform: ' + @HostPlatform + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Procedure: ' + QUOTENAME(DB_NAME(DB_ID())) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@ObjectName) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Parameters: ' + @Parameters + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Version: ' + @VersionTimestamp + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Source: https://ola.hallengren.com' + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + ---------------------------------------------------------------------------------------------------- + --// Check core requirements //-- + ---------------------------------------------------------------------------------------------------- + + IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.', 16, 1 + END + + IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'ANSI_NULLS has to be set to ON for the stored procedure.', 16, 1 + END + + IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.', 16, 1 + END + + IF NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The stored procedure CommandExecute is missing. Download https://ola.hallengren.com/scripts/CommandExecute.sql.', 16, 1 + END + + IF EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute' AND OBJECT_DEFINITION(objects.[object_id]) NOT LIKE '%@DatabaseContext%') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The stored procedure CommandExecute needs to be updated. Download https://ola.hallengren.com/scripts/CommandExecute.sql.', 16, 1 + END + + IF @LogToTable = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandLog') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The table CommandLog is missing. Download https://ola.hallengren.com/scripts/CommandLog.sql.', 16, 1 + END + + IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'Queue') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The table Queue is missing. Download https://ola.hallengren.com/scripts/Queue.sql.', 16, 1 + END + + IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'QueueDatabase') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The table QueueDatabase is missing. Download https://ola.hallengren.com/scripts/QueueDatabase.sql.', 16, 1 + END + + IF @@TRANCOUNT <> 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The transaction count is not 0.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Select databases //-- + ---------------------------------------------------------------------------------------------------- + + SET @Databases = REPLACE(@Databases, CHAR(10), '') + SET @Databases = REPLACE(@Databases, CHAR(13), '') + + WHILE CHARINDEX(@StringDelimiter + ' ', @Databases) > 0 SET @Databases = REPLACE(@Databases, @StringDelimiter + ' ', @StringDelimiter) + WHILE CHARINDEX(' ' + @StringDelimiter, @Databases) > 0 SET @Databases = REPLACE(@Databases, ' ' + @StringDelimiter, @StringDelimiter) + + SET @Databases = LTRIM(RTRIM(@Databases)); + + WITH Databases1 (StartPosition, EndPosition, DatabaseItem) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, 1), 0), LEN(@Databases) + 1) AS EndPosition, + SUBSTRING(@Databases, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, 1), 0), LEN(@Databases) + 1) - 1) AS DatabaseItem + WHERE @Databases IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) AS EndPosition, + SUBSTRING(@Databases, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) - EndPosition - 1) AS DatabaseItem + FROM Databases1 + WHERE EndPosition < LEN(@Databases) + 1 + ), + Databases2 (DatabaseItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN DatabaseItem LIKE '-%' THEN RIGHT(DatabaseItem,LEN(DatabaseItem) - 1) ELSE DatabaseItem END AS DatabaseItem, + StartPosition, + CASE WHEN DatabaseItem LIKE '-%' THEN 0 ELSE 1 END AS Selected + FROM Databases1 + ), + Databases3 (DatabaseItem, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS + ( + SELECT CASE WHEN DatabaseItem IN('ALL_DATABASES','SYSTEM_DATABASES','USER_DATABASES','AVAILABILITY_GROUP_DATABASES') THEN '%' ELSE DatabaseItem END AS DatabaseItem, + CASE WHEN DatabaseItem = 'SYSTEM_DATABASES' THEN 'S' WHEN DatabaseItem = 'USER_DATABASES' THEN 'U' ELSE NULL END AS DatabaseType, + CASE WHEN DatabaseItem = 'AVAILABILITY_GROUP_DATABASES' THEN 1 ELSE NULL END AvailabilityGroup, + StartPosition, + Selected + FROM Databases2 + ), + Databases4 (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS + ( + SELECT CASE WHEN LEFT(DatabaseItem,1) = '[' AND RIGHT(DatabaseItem,1) = ']' THEN PARSENAME(DatabaseItem,1) ELSE DatabaseItem END AS DatabaseItem, + DatabaseType, + AvailabilityGroup, + StartPosition, + Selected + FROM Databases3 + ) + INSERT INTO @SelectedDatabases (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) + SELECT DatabaseName, + DatabaseType, + AvailabilityGroup, + StartPosition, + Selected + FROM Databases4 + OPTION (MAXRECURSION 0) + + IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 + BEGIN + INSERT INTO @tmpAvailabilityGroups (AvailabilityGroupName, Selected) + SELECT name AS AvailabilityGroupName, + 0 AS Selected + FROM sys.availability_groups + + INSERT INTO @tmpDatabasesAvailabilityGroups (DatabaseName, AvailabilityGroupName) + SELECT databases.name, + availability_groups.name + FROM sys.databases databases + INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id + INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id + END + + INSERT INTO @tmpDatabases (DatabaseName, DatabaseType, AvailabilityGroup, [Order], Selected, Completed) + SELECT [name] AS DatabaseName, + CASE WHEN name IN('master','msdb','model') OR is_distributor = 1 THEN 'S' ELSE 'U' END AS DatabaseType, + NULL AS AvailabilityGroup, + 0 AS [Order], + 0 AS Selected, + 0 AS Completed + FROM sys.databases + WHERE [name] <> 'tempdb' + AND source_database_id IS NULL + ORDER BY [name] ASC + + UPDATE tmpDatabases + SET AvailabilityGroup = CASE WHEN EXISTS (SELECT * FROM @tmpDatabasesAvailabilityGroups WHERE DatabaseName = tmpDatabases.DatabaseName) THEN 1 ELSE 0 END + FROM @tmpDatabases tmpDatabases + + UPDATE tmpDatabases + SET tmpDatabases.Selected = SelectedDatabases.Selected + FROM @tmpDatabases tmpDatabases + INNER JOIN @SelectedDatabases SelectedDatabases + ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]') + AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL) + AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL) + WHERE SelectedDatabases.Selected = 1 + + UPDATE tmpDatabases + SET tmpDatabases.Selected = SelectedDatabases.Selected + FROM @tmpDatabases tmpDatabases + INNER JOIN @SelectedDatabases SelectedDatabases + ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]') + AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL) + AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL) + WHERE SelectedDatabases.Selected = 0 + + UPDATE tmpDatabases + SET tmpDatabases.StartPosition = SelectedDatabases2.StartPosition + FROM @tmpDatabases tmpDatabases + INNER JOIN (SELECT tmpDatabases.DatabaseName, MIN(SelectedDatabases.StartPosition) AS StartPosition + FROM @tmpDatabases tmpDatabases + INNER JOIN @SelectedDatabases SelectedDatabases + ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]') + AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL) + AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL) + WHERE SelectedDatabases.Selected = 1 + GROUP BY tmpDatabases.DatabaseName) SelectedDatabases2 + ON tmpDatabases.DatabaseName = SelectedDatabases2.DatabaseName + + IF @Databases IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedDatabases) OR EXISTS(SELECT * FROM @SelectedDatabases WHERE DatabaseName IS NULL OR DatabaseName = '')) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Databases is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Select availability groups //-- + ---------------------------------------------------------------------------------------------------- + + IF @AvailabilityGroups IS NOT NULL AND @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 + BEGIN + + SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(10), '') + SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(13), '') + + WHILE CHARINDEX(@StringDelimiter + ' ', @AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, @StringDelimiter + ' ', @StringDelimiter) + WHILE CHARINDEX(' ' + @StringDelimiter, @AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, ' ' + @StringDelimiter, @StringDelimiter) + + SET @AvailabilityGroups = LTRIM(RTRIM(@AvailabilityGroups)); + + WITH AvailabilityGroups1 (StartPosition, EndPosition, AvailabilityGroupItem) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition, + SUBSTRING(@AvailabilityGroups, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) - 1) AS AvailabilityGroupItem + WHERE @AvailabilityGroups IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition, + SUBSTRING(@AvailabilityGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) - EndPosition - 1) AS AvailabilityGroupItem + FROM AvailabilityGroups1 + WHERE EndPosition < LEN(@AvailabilityGroups) + 1 + ), + AvailabilityGroups2 (AvailabilityGroupItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN AvailabilityGroupItem LIKE '-%' THEN RIGHT(AvailabilityGroupItem,LEN(AvailabilityGroupItem) - 1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem, + StartPosition, + CASE WHEN AvailabilityGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected + FROM AvailabilityGroups1 + ), + AvailabilityGroups3 (AvailabilityGroupItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN AvailabilityGroupItem = 'ALL_AVAILABILITY_GROUPS' THEN '%' ELSE AvailabilityGroupItem END AS AvailabilityGroupItem, + StartPosition, + Selected + FROM AvailabilityGroups2 + ), + AvailabilityGroups4 (AvailabilityGroupName, StartPosition, Selected) AS + ( + SELECT CASE WHEN LEFT(AvailabilityGroupItem,1) = '[' AND RIGHT(AvailabilityGroupItem,1) = ']' THEN PARSENAME(AvailabilityGroupItem,1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem, + StartPosition, + Selected + FROM AvailabilityGroups3 + ) + INSERT INTO @SelectedAvailabilityGroups (AvailabilityGroupName, StartPosition, Selected) + SELECT AvailabilityGroupName, StartPosition, Selected + FROM AvailabilityGroups4 + OPTION (MAXRECURSION 0) + + UPDATE tmpAvailabilityGroups + SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups + ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]') + WHERE SelectedAvailabilityGroups.Selected = 1 + + UPDATE tmpAvailabilityGroups + SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups + ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]') + WHERE SelectedAvailabilityGroups.Selected = 0 + + UPDATE tmpAvailabilityGroups + SET tmpAvailabilityGroups.StartPosition = SelectedAvailabilityGroups2.StartPosition + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN (SELECT tmpAvailabilityGroups.AvailabilityGroupName, MIN(SelectedAvailabilityGroups.StartPosition) AS StartPosition + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups + ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]') + WHERE SelectedAvailabilityGroups.Selected = 1 + GROUP BY tmpAvailabilityGroups.AvailabilityGroupName) SelectedAvailabilityGroups2 + ON tmpAvailabilityGroups.AvailabilityGroupName = SelectedAvailabilityGroups2.AvailabilityGroupName + + UPDATE tmpDatabases + SET tmpDatabases.StartPosition = tmpAvailabilityGroups.StartPosition, + tmpDatabases.Selected = 1 + FROM @tmpDatabases tmpDatabases + INNER JOIN @tmpDatabasesAvailabilityGroups tmpDatabasesAvailabilityGroups ON tmpDatabases.DatabaseName = tmpDatabasesAvailabilityGroups.DatabaseName + INNER JOIN @tmpAvailabilityGroups tmpAvailabilityGroups ON tmpDatabasesAvailabilityGroups.AvailabilityGroupName = tmpAvailabilityGroups.AvailabilityGroupName + WHERE tmpAvailabilityGroups.Selected = 1 + + END + + IF @AvailabilityGroups IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedAvailabilityGroups) OR EXISTS(SELECT * FROM @SelectedAvailabilityGroups WHERE AvailabilityGroupName IS NULL OR AvailabilityGroupName = '') OR @Version < 11 OR SERVERPROPERTY('IsHadrEnabled') = 0) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @AvailabilityGroups is not supported.', 16, 1 + END + + IF (@Databases IS NULL AND @AvailabilityGroups IS NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'You need to specify one of the parameters @Databases and @AvailabilityGroups.', 16, 2 + END + + IF (@Databases IS NOT NULL AND @AvailabilityGroups IS NOT NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'You can only specify one of the parameters @Databases and @AvailabilityGroups.', 16, 3 + END + + ---------------------------------------------------------------------------------------------------- + --// Select indexes //-- + ---------------------------------------------------------------------------------------------------- + + SET @Indexes = REPLACE(@Indexes, CHAR(10), '') + SET @Indexes = REPLACE(@Indexes, CHAR(13), '') + + WHILE CHARINDEX(@StringDelimiter + ' ', @Indexes) > 0 SET @Indexes = REPLACE(@Indexes, @StringDelimiter + ' ', @StringDelimiter) + WHILE CHARINDEX(' ' + @StringDelimiter, @Indexes) > 0 SET @Indexes = REPLACE(@Indexes, ' ' + @StringDelimiter, @StringDelimiter) + + SET @Indexes = LTRIM(RTRIM(@Indexes)); + + WITH Indexes1 (StartPosition, EndPosition, IndexItem) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Indexes, 1), 0), LEN(@Indexes) + 1) AS EndPosition, + SUBSTRING(@Indexes, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Indexes, 1), 0), LEN(@Indexes) + 1) - 1) AS IndexItem + WHERE @Indexes IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Indexes, EndPosition + 1), 0), LEN(@Indexes) + 1) AS EndPosition, + SUBSTRING(@Indexes, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Indexes, EndPosition + 1), 0), LEN(@Indexes) + 1) - EndPosition - 1) AS IndexItem + FROM Indexes1 + WHERE EndPosition < LEN(@Indexes) + 1 + ), + Indexes2 (IndexItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN IndexItem LIKE '-%' THEN RIGHT(IndexItem,LEN(IndexItem) - 1) ELSE IndexItem END AS IndexItem, + StartPosition, + CASE WHEN IndexItem LIKE '-%' THEN 0 ELSE 1 END AS Selected + FROM Indexes1 + ), + Indexes3 (IndexItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN IndexItem = 'ALL_INDEXES' THEN '%.%.%.%' ELSE IndexItem END AS IndexItem, + StartPosition, + Selected + FROM Indexes2 + ), + Indexes4 (DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected) AS + ( + SELECT CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,3) ELSE PARSENAME(IndexItem,4) END AS DatabaseName, + CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,2) ELSE PARSENAME(IndexItem,3) END AS SchemaName, + CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,1) ELSE PARSENAME(IndexItem,2) END AS ObjectName, + CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN '%' ELSE PARSENAME(IndexItem,1) END AS IndexName, + StartPosition, + Selected + FROM Indexes3 + ) + INSERT INTO @SelectedIndexes (DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected) + SELECT DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected + FROM Indexes4 + OPTION (MAXRECURSION 0) + + ---------------------------------------------------------------------------------------------------- + --// Select actions //-- + ---------------------------------------------------------------------------------------------------- + + SET @FragmentationLow = REPLACE(@FragmentationLow, @StringDelimiter + ' ', @StringDelimiter); + + WITH FragmentationLow (StartPosition, EndPosition, [Action]) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationLow, 1), 0), LEN(@FragmentationLow) + 1) AS EndPosition, + SUBSTRING(@FragmentationLow, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationLow, 1), 0), LEN(@FragmentationLow) + 1) - 1) AS [Action] + WHERE @FragmentationLow IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationLow, EndPosition + 1), 0), LEN(@FragmentationLow) + 1) AS EndPosition, + SUBSTRING(@FragmentationLow, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationLow, EndPosition + 1), 0), LEN(@FragmentationLow) + 1) - EndPosition - 1) AS [Action] + FROM FragmentationLow + WHERE EndPosition < LEN(@FragmentationLow) + 1 + ) + INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action]) + SELECT 'Low' AS FragmentationGroup, + ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority], + [Action] + FROM FragmentationLow + OPTION (MAXRECURSION 0) + + SET @FragmentationMedium = REPLACE(@FragmentationMedium, @StringDelimiter + ' ', @StringDelimiter); + + WITH FragmentationMedium (StartPosition, EndPosition, [Action]) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationMedium, 1), 0), LEN(@FragmentationMedium) + 1) AS EndPosition, + SUBSTRING(@FragmentationMedium, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationMedium, 1), 0), LEN(@FragmentationMedium) + 1) - 1) AS [Action] + WHERE @FragmentationMedium IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationMedium, EndPosition + 1), 0), LEN(@FragmentationMedium) + 1) AS EndPosition, + SUBSTRING(@FragmentationMedium, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationMedium, EndPosition + 1), 0), LEN(@FragmentationMedium) + 1) - EndPosition - 1) AS [Action] + FROM FragmentationMedium + WHERE EndPosition < LEN(@FragmentationMedium) + 1 + ) + INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action]) + SELECT 'Medium' AS FragmentationGroup, + ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority], + [Action] + FROM FragmentationMedium + OPTION (MAXRECURSION 0) + + SET @FragmentationHigh = REPLACE(@FragmentationHigh, @StringDelimiter + ' ', @StringDelimiter); + + WITH FragmentationHigh (StartPosition, EndPosition, [Action]) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationHigh, 1), 0), LEN(@FragmentationHigh) + 1) AS EndPosition, + SUBSTRING(@FragmentationHigh, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationHigh, 1), 0), LEN(@FragmentationHigh) + 1) - 1) AS [Action] + WHERE @FragmentationHigh IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationHigh, EndPosition + 1), 0), LEN(@FragmentationHigh) + 1) AS EndPosition, + SUBSTRING(@FragmentationHigh, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationHigh, EndPosition + 1), 0), LEN(@FragmentationHigh) + 1) - EndPosition - 1) AS [Action] + FROM FragmentationHigh + WHERE EndPosition < LEN(@FragmentationHigh) + 1 + ) + INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action]) + SELECT 'High' AS FragmentationGroup, + ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority], + [Action] + FROM FragmentationHigh + OPTION (MAXRECURSION 0) + + ---------------------------------------------------------------------------------------------------- + --// Check input parameters //-- + ---------------------------------------------------------------------------------------------------- + + IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'Low' AND [Action] NOT IN(SELECT * FROM @Actions)) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLow is not supported.', 16, 1 + END + + IF EXISTS (SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'Low' GROUP BY [Action] HAVING COUNT(*) > 1) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLow is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'Medium' AND [Action] NOT IN(SELECT * FROM @Actions)) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationMedium is not supported.', 16, 1 + END + + IF EXISTS (SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'Medium' GROUP BY [Action] HAVING COUNT(*) > 1) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationMedium is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'High' AND [Action] NOT IN(SELECT * FROM @Actions)) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationHigh is not supported.', 16, 1 + END + + IF EXISTS (SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'High' GROUP BY [Action] HAVING COUNT(*) > 1) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationHigh is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @FragmentationLevel1 <= 0 OR @FragmentationLevel1 >= 100 OR @FragmentationLevel1 IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLevel1 is not supported.', 16, 1 + END + + IF @FragmentationLevel1 >= @FragmentationLevel2 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLevel1 is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @FragmentationLevel2 <= 0 OR @FragmentationLevel2 >= 100 OR @FragmentationLevel2 IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLevel2 is not supported.', 16, 1 + END + + IF @FragmentationLevel2 <= @FragmentationLevel1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLevel2 is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @MinNumberOfPages < 0 OR @MinNumberOfPages IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @MinNumberOfPages is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @MaxNumberOfPages < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @MaxNumberOfPages is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @SortInTempdb NOT IN('Y','N') OR @SortInTempdb IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @SortInTempdb is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @MaxDOP < 0 OR @MaxDOP > 64 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @MaxDOP is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @FillFactor <= 0 OR @FillFactor > 100 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FillFactor is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @PadIndex NOT IN('Y','N') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @PadIndex is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @LOBCompaction NOT IN('Y','N') OR @LOBCompaction IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LOBCompaction is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @UpdateStatistics NOT IN('ALL','COLUMNS','INDEX') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @UpdateStatistics is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @OnlyModifiedStatistics NOT IN('Y','N') OR @OnlyModifiedStatistics IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @OnlyModifiedStatistics is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @StatisticsModificationLevel <= 0 OR @StatisticsModificationLevel > 100 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @StatisticsModificationLevel is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @OnlyModifiedStatistics = 'Y' AND @StatisticsModificationLevel IS NOT NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'You can only specify one of the parameters @OnlyModifiedStatistics and @StatisticsModificationLevel.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @StatisticsSample <= 0 OR @StatisticsSample > 100 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @StatisticsSample is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @StatisticsResample NOT IN('Y','N') OR @StatisticsResample IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @StatisticsResample is not supported.', 16, 1 + END + + IF @StatisticsResample = 'Y' AND @StatisticsSample IS NOT NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @StatisticsResample is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @PartitionLevel NOT IN('Y','N') OR @PartitionLevel IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @PartitionLevel is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @MSShippedObjects NOT IN('Y','N') OR @MSShippedObjects IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @MSShippedObjects is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF EXISTS(SELECT * FROM @SelectedIndexes WHERE DatabaseName IS NULL OR SchemaName IS NULL OR ObjectName IS NULL OR IndexName IS NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Indexes is not supported.', 16, 1 + END + + IF @Indexes IS NOT NULL AND NOT EXISTS(SELECT * FROM @SelectedIndexes) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Indexes is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @TimeLimit < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @TimeLimit is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @Delay < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Delay is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @WaitAtLowPriorityMaxDuration < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @WaitAtLowPriorityMaxDuration is not supported.', 16, 1 + END + + IF @WaitAtLowPriorityMaxDuration IS NOT NULL AND @Version < 12 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @WaitAtLowPriorityMaxDuration is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @WaitAtLowPriorityAbortAfterWait NOT IN('NONE','SELF','BLOCKERS') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @WaitAtLowPriorityAbortAfterWait is not supported.', 16, 1 + END + + IF @WaitAtLowPriorityAbortAfterWait IS NOT NULL AND @Version < 12 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @WaitAtLowPriorityAbortAfterWait is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF (@WaitAtLowPriorityAbortAfterWait IS NOT NULL AND @WaitAtLowPriorityMaxDuration IS NULL) OR (@WaitAtLowPriorityAbortAfterWait IS NULL AND @WaitAtLowPriorityMaxDuration IS NOT NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The parameters @WaitAtLowPriorityMaxDuration and @WaitAtLowPriorityAbortAfterWait can only be used together.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @Resumable NOT IN('Y','N') OR @Resumable IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Resumable is not supported.', 16, 1 + END + + IF @Resumable = 'Y' AND NOT (@Version >= 14 OR SERVERPROPERTY('EngineEdition') IN (5, 8)) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Resumable is not supported.', 16, 2 + END + + IF @Resumable = 'Y' AND @SortInTempdb = 'Y' + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'You can only specify one of the parameters @Resumable and @SortInTempdb.', 16, 3 + END + + ---------------------------------------------------------------------------------------------------- + + IF @LockTimeout < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LockTimeout is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @LockMessageSeverity NOT IN(10, 16) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LockMessageSeverity is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @StringDelimiter IS NULL OR LEN(@StringDelimiter) > 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @StringDelimiter is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @DatabaseOrder NOT IN('DATABASE_NAME_ASC','DATABASE_NAME_DESC','DATABASE_SIZE_ASC','DATABASE_SIZE_DESC') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabaseOrder is not supported.', 16, 1 + END + + IF @DatabaseOrder IS NOT NULL AND SERVERPROPERTY('EngineEdition') = 5 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabaseOrder is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @DatabasesInParallel NOT IN('Y','N') OR @DatabasesInParallel IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabasesInParallel is not supported.', 16, 1 + END + + IF @DatabasesInParallel = 'Y' AND SERVERPROPERTY('EngineEdition') = 5 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabasesInParallel is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LogToTable is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @Execute NOT IN('Y','N') OR @Execute IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Execute is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF EXISTS(SELECT * FROM @Errors) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The documentation is available at https://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Check that selected databases and availability groups exist //-- + ---------------------------------------------------------------------------------------------------- + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', ' + FROM @SelectedDatabases + WHERE DatabaseName NOT LIKE '%[%]%' + AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following databases in the @Databases parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', ' + FROM @SelectedIndexes + WHERE DatabaseName NOT LIKE '%[%]%' + AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following databases in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(AvailabilityGroupName) + ', ' + FROM @SelectedAvailabilityGroups + WHERE AvailabilityGroupName NOT LIKE '%[%]%' + AND AvailabilityGroupName NOT IN (SELECT AvailabilityGroupName FROM @tmpAvailabilityGroups) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following availability groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', ' + FROM @SelectedIndexes + WHERE DatabaseName NOT LIKE '%[%]%' + AND DatabaseName IN (SELECT DatabaseName FROM @tmpDatabases) + AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases WHERE Selected = 1) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following databases have been selected in the @Indexes parameter, but not in the @Databases or @AvailabilityGroups parameters: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Raise errors //-- + ---------------------------------------------------------------------------------------------------- + + DECLARE ErrorCursor CURSOR FAST_FORWARD FOR SELECT [Message], Severity, [State] FROM @Errors ORDER BY [ID] ASC + + OPEN ErrorCursor + + FETCH ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState + + WHILE @@FETCH_STATUS = 0 + BEGIN + RAISERROR('%s', @CurrentSeverity, @CurrentState, @CurrentMessage) WITH NOWAIT + RAISERROR(@EmptyLine, 10, 1) WITH NOWAIT + + FETCH NEXT FROM ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState + END + + CLOSE ErrorCursor + + DEALLOCATE ErrorCursor + + IF EXISTS (SELECT * FROM @Errors WHERE Severity >= 16) + BEGIN + SET @ReturnCode = 50000 + GOTO Logging + END + + ---------------------------------------------------------------------------------------------------- + --// Should statistics be updated on the partition level? //-- + ---------------------------------------------------------------------------------------------------- + + SET @PartitionLevelStatistics = CASE WHEN @PartitionLevel = 'Y' AND ((@Version >= 12.05 AND @Version < 13) OR @Version >= 13.04422 OR SERVERPROPERTY('EngineEdition') IN (5,8)) THEN 1 ELSE 0 END + + ---------------------------------------------------------------------------------------------------- + --// Update database order //-- + ---------------------------------------------------------------------------------------------------- + + IF @DatabaseOrder IN('DATABASE_SIZE_ASC','DATABASE_SIZE_DESC') + BEGIN + UPDATE tmpDatabases + SET DatabaseSize = (SELECT SUM(CAST(size AS bigint)) FROM sys.master_files WHERE [type] = 0 AND database_id = DB_ID(tmpDatabases.DatabaseName)) + FROM @tmpDatabases tmpDatabases + END + + IF @DatabaseOrder IS NULL + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, DatabaseName ASC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_NAME_ASC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName ASC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_NAME_DESC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName DESC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_SIZE_ASC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize ASC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_SIZE_DESC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize DESC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + + ---------------------------------------------------------------------------------------------------- + --// Update the queue //-- + ---------------------------------------------------------------------------------------------------- + + IF @DatabasesInParallel = 'Y' + BEGIN + + BEGIN TRY + + SELECT @QueueID = QueueID + FROM dbo.[Queue] + WHERE SchemaName = @SchemaName + AND ObjectName = @ObjectName + AND [Parameters] = @Parameters + + IF @QueueID IS NULL + BEGIN + BEGIN TRANSACTION + + SELECT @QueueID = QueueID + FROM dbo.[Queue] WITH (UPDLOCK, HOLDLOCK) + WHERE SchemaName = @SchemaName + AND ObjectName = @ObjectName + AND [Parameters] = @Parameters + + IF @QueueID IS NULL + BEGIN + INSERT INTO dbo.[Queue] (SchemaName, ObjectName, [Parameters]) + SELECT @SchemaName, @ObjectName, @Parameters + + SET @QueueID = SCOPE_IDENTITY() + END + + COMMIT TRANSACTION + END + + BEGIN TRANSACTION + + UPDATE [Queue] + SET QueueStartTime = SYSDATETIME(), + SessionID = @@SPID, + RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID), + RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID) + FROM dbo.[Queue] [Queue] + WHERE QueueID = @QueueID + AND NOT EXISTS (SELECT * + FROM sys.dm_exec_requests + WHERE session_id = [Queue].SessionID + AND request_id = [Queue].RequestID + AND start_time = [Queue].RequestStartTime) + AND NOT EXISTS (SELECT * + FROM dbo.QueueDatabase QueueDatabase + INNER JOIN sys.dm_exec_requests ON QueueDatabase.SessionID = session_id AND QueueDatabase.RequestID = request_id AND QueueDatabase.RequestStartTime = start_time + WHERE QueueDatabase.QueueID = @QueueID) + + IF @@ROWCOUNT = 1 + BEGIN + INSERT INTO dbo.QueueDatabase (QueueID, DatabaseName) + SELECT @QueueID AS QueueID, + DatabaseName + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + AND NOT EXISTS (SELECT * FROM dbo.QueueDatabase WHERE DatabaseName = tmpDatabases.DatabaseName AND QueueID = @QueueID) + + DELETE QueueDatabase + FROM dbo.QueueDatabase QueueDatabase + WHERE QueueID = @QueueID + AND NOT EXISTS (SELECT * FROM @tmpDatabases tmpDatabases WHERE DatabaseName = QueueDatabase.DatabaseName AND Selected = 1) + + UPDATE QueueDatabase + SET DatabaseOrder = tmpDatabases.[Order] + FROM dbo.QueueDatabase QueueDatabase + INNER JOIN @tmpDatabases tmpDatabases ON QueueDatabase.DatabaseName = tmpDatabases.DatabaseName + WHERE QueueID = @QueueID + END + + COMMIT TRANSACTION + + SELECT @QueueStartTime = QueueStartTime + FROM dbo.[Queue] + WHERE QueueID = @QueueID + + END TRY + + BEGIN CATCH + IF XACT_STATE() <> 0 + BEGIN + ROLLBACK TRANSACTION + END + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + SET @ReturnCode = ERROR_NUMBER() + GOTO Logging + END CATCH + + END + + ---------------------------------------------------------------------------------------------------- + --// Execute commands //-- + ---------------------------------------------------------------------------------------------------- + + WHILE (1 = 1) + BEGIN + + IF @DatabasesInParallel = 'Y' + BEGIN + UPDATE QueueDatabase + SET DatabaseStartTime = NULL, + SessionID = NULL, + RequestID = NULL, + RequestStartTime = NULL + FROM dbo.QueueDatabase QueueDatabase + WHERE QueueID = @QueueID + AND DatabaseStartTime IS NOT NULL + AND DatabaseEndTime IS NULL + AND NOT EXISTS (SELECT * FROM sys.dm_exec_requests WHERE session_id = QueueDatabase.SessionID AND request_id = QueueDatabase.RequestID AND start_time = QueueDatabase.RequestStartTime) + + UPDATE QueueDatabase + SET DatabaseStartTime = SYSDATETIME(), + DatabaseEndTime = NULL, + SessionID = @@SPID, + RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID), + RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID), + @CurrentDatabaseName = DatabaseName + FROM (SELECT TOP 1 DatabaseStartTime, + DatabaseEndTime, + SessionID, + RequestID, + RequestStartTime, + DatabaseName + FROM dbo.QueueDatabase + WHERE QueueID = @QueueID + AND (DatabaseStartTime < @QueueStartTime OR DatabaseStartTime IS NULL) + AND NOT (DatabaseStartTime IS NOT NULL AND DatabaseEndTime IS NULL) + ORDER BY DatabaseOrder ASC + ) QueueDatabase + END + ELSE + BEGIN + SELECT TOP 1 @CurrentDBID = ID, + @CurrentDatabaseName = DatabaseName + FROM @tmpDatabases + WHERE Selected = 1 + AND Completed = 0 + ORDER BY [Order] ASC + END + + IF @@ROWCOUNT = 0 + BEGIN + BREAK + END + + SET @CurrentDatabase_sp_executesql = QUOTENAME(@CurrentDatabaseName) + '.sys.sp_executesql' + + BEGIN + SET @DatabaseMessage = 'Date and time: ' + CONVERT(nvarchar,SYSDATETIME(),120) + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Database: ' + QUOTENAME(@CurrentDatabaseName) + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + SELECT @CurrentUserAccess = user_access_desc, + @CurrentIsReadOnly = is_read_only, + @CurrentDatabaseState = state_desc, + @CurrentInStandby = is_in_standby, + @CurrentRecoveryModel = recovery_model_desc + FROM sys.databases + WHERE [name] = @CurrentDatabaseName + + BEGIN + SET @DatabaseMessage = 'State: ' + @CurrentDatabaseState + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Standby: ' + CASE WHEN @CurrentInStandby = 1 THEN 'Yes' ELSE 'No' END + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Updateability: ' + CASE WHEN @CurrentIsReadOnly = 1 THEN 'READ_ONLY' WHEN @CurrentIsReadOnly = 0 THEN 'READ_WRITE' END + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'User access: ' + @CurrentUserAccess + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Recovery model: ' + @CurrentRecoveryModel + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + IF @CurrentDatabaseState = 'ONLINE' AND SERVERPROPERTY('EngineEdition') <> 5 + BEGIN + IF EXISTS (SELECT * FROM sys.database_recovery_status WHERE database_id = DB_ID(@CurrentDatabaseName) AND database_guid IS NOT NULL) + BEGIN + SET @CurrentIsDatabaseAccessible = 1 + END + ELSE + BEGIN + SET @CurrentIsDatabaseAccessible = 0 + END + END + + IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 + BEGIN + SELECT @CurrentAvailabilityGroup = availability_groups.name, + @CurrentAvailabilityGroupRole = dm_hadr_availability_replica_states.role_desc + FROM sys.databases databases + INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id + INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id + WHERE databases.name = @CurrentDatabaseName + END + + IF SERVERPROPERTY('EngineEdition') <> 5 + BEGIN + SELECT @CurrentDatabaseMirroringRole = UPPER(mirroring_role_desc) + FROM sys.database_mirroring + WHERE database_id = DB_ID(@CurrentDatabaseName) + END + + IF @CurrentIsDatabaseAccessible IS NOT NULL + BEGIN + SET @DatabaseMessage = 'Is accessible: ' + CASE WHEN @CurrentIsDatabaseAccessible = 1 THEN 'Yes' ELSE 'No' END + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + IF @CurrentAvailabilityGroup IS NOT NULL + BEGIN + SET @DatabaseMessage = 'Availability group: ' + ISNULL(@CurrentAvailabilityGroup,'N/A') + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Availability group role: ' + ISNULL(@CurrentAvailabilityGroupRole,'N/A') + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + IF @CurrentDatabaseMirroringRole IS NOT NULL + BEGIN + SET @DatabaseMessage = 'Database mirroring role: ' + @CurrentDatabaseMirroringRole + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF @CurrentDatabaseState = 'ONLINE' + AND NOT (@CurrentUserAccess = 'SINGLE_USER' AND @CurrentIsDatabaseAccessible = 0) + AND DATABASEPROPERTYEX(@CurrentDatabaseName,'Updateability') = 'READ_WRITE' + BEGIN + + -- Select indexes in the current database + IF (EXISTS(SELECT * FROM @ActionsPreferred) OR @UpdateStatistics IS NOT NULL) AND (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SET @CurrentCommand = 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;' + + ' SELECT SchemaID, SchemaName, ObjectID, ObjectName, ObjectType, IsMemoryOptimized, IndexID, IndexName, IndexType, AllowPageLocks, IsImageText, IsNewLOB, IsFileStream, IsColumnStore, IsComputed, IsTimestamp, OnReadOnlyFileGroup, ResumableIndexOperation, StatisticsID, StatisticsName, NoRecompute, IsIncremental, PartitionID, PartitionNumber, PartitionCount, [Order], Selected, Completed' + + ' FROM (' + + IF EXISTS(SELECT * FROM @ActionsPreferred) OR @UpdateStatistics IN('ALL','INDEX') + BEGIN + SET @CurrentCommand = @CurrentCommand + 'SELECT schemas.[schema_id] AS SchemaID' + + ', schemas.[name] AS SchemaName' + + ', objects.[object_id] AS ObjectID' + + ', objects.[name] AS ObjectName' + + ', RTRIM(objects.[type]) AS ObjectType' + + ', ' + CASE WHEN @Version >= 12 THEN 'tables.is_memory_optimized' ELSE '0' END + ' AS IsMemoryOptimized' + + ', indexes.index_id AS IndexID' + + ', indexes.[name] AS IndexName' + + ', indexes.[type] AS IndexType' + + ', indexes.allow_page_locks AS AllowPageLocks' + + + ', CASE WHEN indexes.[type] = 1 AND EXISTS(SELECT * FROM sys.columns columns INNER JOIN sys.types types ON columns.system_type_id = types.user_type_id WHERE columns.[object_id] = objects.object_id AND types.name IN(''image'',''text'',''ntext'')) THEN 1 ELSE 0 END AS IsImageText' + + + ', CASE WHEN indexes.[type] = 1 AND EXISTS(SELECT * FROM sys.columns columns INNER JOIN sys.types types ON columns.system_type_id = types.user_type_id OR (columns.user_type_id = types.user_type_id AND types.is_assembly_type = 1) WHERE columns.[object_id] = objects.object_id AND (types.name IN(''xml'') OR (types.name IN(''varchar'',''nvarchar'',''varbinary'') AND columns.max_length = -1) OR (types.is_assembly_type = 1 AND columns.max_length = -1))) THEN 1' + + ' WHEN indexes.[type] = 2 AND EXISTS(SELECT * FROM sys.index_columns index_columns INNER JOIN sys.columns columns ON index_columns.[object_id] = columns.[object_id] AND index_columns.column_id = columns.column_id INNER JOIN sys.types types ON columns.system_type_id = types.user_type_id OR (columns.user_type_id = types.user_type_id AND types.is_assembly_type = 1) WHERE index_columns.[object_id] = objects.object_id AND index_columns.index_id = indexes.index_id AND (types.[name] IN(''xml'') OR (types.[name] IN(''varchar'',''nvarchar'',''varbinary'') AND columns.max_length = -1) OR (types.is_assembly_type = 1 AND columns.max_length = -1))) THEN 1 ELSE 0 END AS IsNewLOB' + + + ', CASE WHEN indexes.[type] = 1 AND EXISTS(SELECT * FROM sys.columns columns WHERE columns.[object_id] = objects.object_id AND columns.is_filestream = 1) THEN 1 ELSE 0 END AS IsFileStream' + + + ', CASE WHEN EXISTS(SELECT * FROM sys.indexes indexes WHERE indexes.[object_id] = objects.object_id AND [type] IN(5,6)) THEN 1 ELSE 0 END AS IsColumnStore' + + + ', CASE WHEN EXISTS(SELECT * FROM sys.index_columns index_columns INNER JOIN sys.columns columns ON index_columns.object_id = columns.object_id AND index_columns.column_id = columns.column_id WHERE (index_columns.key_ordinal > 0 OR index_columns.partition_ordinal > 0) AND columns.is_computed = 1 AND index_columns.object_id = indexes.object_id AND index_columns.index_id = indexes.index_id) THEN 1 ELSE 0 END AS IsComputed' + + + ', CASE WHEN EXISTS(SELECT * FROM sys.index_columns index_columns INNER JOIN sys.columns columns ON index_columns.[object_id] = columns.[object_id] AND index_columns.column_id = columns.column_id INNER JOIN sys.types types ON columns.system_type_id = types.system_type_id WHERE index_columns.[object_id] = objects.object_id AND index_columns.index_id = indexes.index_id AND types.[name] = ''timestamp'') THEN 1 ELSE 0 END AS IsTimestamp' + + + ', CASE WHEN EXISTS (SELECT * FROM sys.indexes indexes2 INNER JOIN sys.destination_data_spaces destination_data_spaces ON indexes.data_space_id = destination_data_spaces.partition_scheme_id INNER JOIN sys.filegroups filegroups ON destination_data_spaces.data_space_id = filegroups.data_space_id WHERE filegroups.is_read_only = 1 AND indexes2.[object_id] = indexes.[object_id] AND indexes2.[index_id] = indexes.index_id' + CASE WHEN @PartitionLevel = 'Y' THEN ' AND destination_data_spaces.destination_id = partitions.partition_number' ELSE '' END + ') THEN 1' + + ' WHEN EXISTS (SELECT * FROM sys.indexes indexes2 INNER JOIN sys.filegroups filegroups ON indexes.data_space_id = filegroups.data_space_id WHERE filegroups.is_read_only = 1 AND indexes.[object_id] = indexes2.[object_id] AND indexes.[index_id] = indexes2.index_id) THEN 1' + + ' WHEN indexes.[type] = 1 AND EXISTS (SELECT * FROM sys.tables tables INNER JOIN sys.filegroups filegroups ON tables.lob_data_space_id = filegroups.data_space_id WHERE filegroups.is_read_only = 1 AND tables.[object_id] = objects.[object_id]) THEN 1 ELSE 0 END AS OnReadOnlyFileGroup' + + + ', ' + CASE WHEN @Version >= 14 THEN 'CASE WHEN EXISTS(SELECT * FROM sys.index_resumable_operations index_resumable_operations WHERE state_desc = ''PAUSED'' AND index_resumable_operations.object_id = indexes.object_id AND index_resumable_operations.index_id = indexes.index_id AND (index_resumable_operations.partition_number = partitions.partition_number OR index_resumable_operations.partition_number IS NULL)) THEN 1 ELSE 0 END' ELSE '0' END + ' AS ResumableIndexOperation' + + + ', stats.stats_id AS StatisticsID' + + ', stats.name AS StatisticsName' + + ', stats.no_recompute AS NoRecompute' + + ', ' + CASE WHEN @Version >= 12 THEN 'stats.is_incremental' ELSE '0' END + ' AS IsIncremental' + + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'partitions.partition_id AS PartitionID' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionID' END + + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'partitions.partition_number AS PartitionNumber' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionNumber' END + + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'IndexPartitions.partition_count AS PartitionCount' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionCount' END + + ', 0 AS [Order]' + + ', 0 AS Selected' + + ', 0 AS Completed' + + ' FROM sys.indexes indexes' + + ' INNER JOIN sys.objects objects ON indexes.[object_id] = objects.[object_id]' + + ' INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id]' + + ' LEFT OUTER JOIN sys.tables tables ON objects.[object_id] = tables.[object_id]' + + ' LEFT OUTER JOIN sys.stats stats ON indexes.[object_id] = stats.[object_id] AND indexes.[index_id] = stats.[stats_id]' + IF @PartitionLevel = 'Y' + BEGIN + SET @CurrentCommand = @CurrentCommand + ' LEFT OUTER JOIN sys.partitions partitions ON indexes.[object_id] = partitions.[object_id] AND indexes.index_id = partitions.index_id' + + ' LEFT OUTER JOIN (SELECT partitions.[object_id], partitions.index_id, COUNT(DISTINCT partitions.partition_number) AS partition_count FROM sys.partitions partitions GROUP BY partitions.[object_id], partitions.index_id) IndexPartitions ON partitions.[object_id] = IndexPartitions.[object_id] AND partitions.[index_id] = IndexPartitions.[index_id]' + END + + SET @CurrentCommand = @CurrentCommand + ' WHERE objects.[type] IN(''U'',''V'')' + + CASE WHEN @MSShippedObjects = 'N' THEN ' AND objects.is_ms_shipped = 0' ELSE '' END + + ' AND indexes.[type] IN(1,2,3,4,5,6,7)' + + ' AND indexes.is_disabled = 0 AND indexes.is_hypothetical = 0' + END + + IF (EXISTS(SELECT * FROM @ActionsPreferred) AND @UpdateStatistics = 'COLUMNS') OR @UpdateStatistics = 'ALL' + BEGIN + SET @CurrentCommand = @CurrentCommand + ' UNION ' + END + + IF @UpdateStatistics IN('ALL','COLUMNS') + BEGIN + SET @CurrentCommand = @CurrentCommand + 'SELECT schemas.[schema_id] AS SchemaID' + + ', schemas.[name] AS SchemaName' + + ', objects.[object_id] AS ObjectID' + + ', objects.[name] AS ObjectName' + + ', RTRIM(objects.[type]) AS ObjectType' + + ', ' + CASE WHEN @Version >= 12 THEN 'tables.is_memory_optimized' ELSE '0' END + ' AS IsMemoryOptimized' + + ', NULL AS IndexID, NULL AS IndexName' + + ', NULL AS IndexType' + + ', NULL AS AllowPageLocks' + + ', NULL AS IsImageText' + + ', NULL AS IsNewLOB' + + ', NULL AS IsFileStream' + + ', NULL AS IsColumnStore' + + ', NULL AS IsComputed' + + ', NULL AS IsTimestamp' + + ', NULL AS OnReadOnlyFileGroup' + + ', NULL AS ResumableIndexOperation' + + ', stats.stats_id AS StatisticsID' + + ', stats.name AS StatisticsName' + + ', stats.no_recompute AS NoRecompute' + + ', ' + CASE WHEN @Version >= 12 THEN 'stats.is_incremental' ELSE '0' END + ' AS IsIncremental' + + ', NULL AS PartitionID' + + ', ' + CASE WHEN @PartitionLevelStatistics = 1 THEN 'dm_db_incremental_stats_properties.partition_number' ELSE 'NULL' END + ' AS PartitionNumber' + + ', NULL AS PartitionCount' + + ', 0 AS [Order]' + + ', 0 AS Selected' + + ', 0 AS Completed' + + ' FROM sys.stats stats' + + ' INNER JOIN sys.objects objects ON stats.[object_id] = objects.[object_id]' + + ' INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id]' + + ' LEFT OUTER JOIN sys.tables tables ON objects.[object_id] = tables.[object_id]' + + IF @PartitionLevelStatistics = 1 + BEGIN + SET @CurrentCommand = @CurrentCommand + ' OUTER APPLY sys.dm_db_incremental_stats_properties(stats.object_id, stats.stats_id) dm_db_incremental_stats_properties' + END + + SET @CurrentCommand = @CurrentCommand + ' WHERE objects.[type] IN(''U'',''V'')' + + CASE WHEN @MSShippedObjects = 'N' THEN ' AND objects.is_ms_shipped = 0' ELSE '' END + + ' AND NOT EXISTS(SELECT * FROM sys.indexes indexes WHERE indexes.[object_id] = stats.[object_id] AND indexes.index_id = stats.stats_id)' + END + + SET @CurrentCommand = @CurrentCommand + ') IndexesStatistics' + + INSERT INTO @tmpIndexesStatistics (SchemaID, SchemaName, ObjectID, ObjectName, ObjectType, IsMemoryOptimized, IndexID, IndexName, IndexType, AllowPageLocks, IsImageText, IsNewLOB, IsFileStream, IsColumnStore, IsComputed, IsTimestamp, OnReadOnlyFileGroup, ResumableIndexOperation, StatisticsID, StatisticsName, [NoRecompute], IsIncremental, PartitionID, PartitionNumber, PartitionCount, [Order], Selected, Completed) + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand + SET @Error = @@ERROR + IF @Error <> 0 + BEGIN + SET @ReturnCode = @Error + END + END + + IF @Indexes IS NULL + BEGIN + UPDATE tmpIndexesStatistics + SET tmpIndexesStatistics.Selected = 1 + FROM @tmpIndexesStatistics tmpIndexesStatistics + END + ELSE + BEGIN + UPDATE tmpIndexesStatistics + SET tmpIndexesStatistics.Selected = SelectedIndexes.Selected + FROM @tmpIndexesStatistics tmpIndexesStatistics + INNER JOIN @SelectedIndexes SelectedIndexes + ON @CurrentDatabaseName LIKE REPLACE(SelectedIndexes.DatabaseName,'_','[_]') AND tmpIndexesStatistics.SchemaName LIKE REPLACE(SelectedIndexes.SchemaName,'_','[_]') AND tmpIndexesStatistics.ObjectName LIKE REPLACE(SelectedIndexes.ObjectName,'_','[_]') AND COALESCE(tmpIndexesStatistics.IndexName,tmpIndexesStatistics.StatisticsName) LIKE REPLACE(SelectedIndexes.IndexName,'_','[_]') + WHERE SelectedIndexes.Selected = 1 + + UPDATE tmpIndexesStatistics + SET tmpIndexesStatistics.Selected = SelectedIndexes.Selected + FROM @tmpIndexesStatistics tmpIndexesStatistics + INNER JOIN @SelectedIndexes SelectedIndexes + ON @CurrentDatabaseName LIKE REPLACE(SelectedIndexes.DatabaseName,'_','[_]') AND tmpIndexesStatistics.SchemaName LIKE REPLACE(SelectedIndexes.SchemaName,'_','[_]') AND tmpIndexesStatistics.ObjectName LIKE REPLACE(SelectedIndexes.ObjectName,'_','[_]') AND COALESCE(tmpIndexesStatistics.IndexName,tmpIndexesStatistics.StatisticsName) LIKE REPLACE(SelectedIndexes.IndexName,'_','[_]') + WHERE SelectedIndexes.Selected = 0 + + UPDATE tmpIndexesStatistics + SET tmpIndexesStatistics.StartPosition = SelectedIndexes2.StartPosition + FROM @tmpIndexesStatistics tmpIndexesStatistics + INNER JOIN (SELECT tmpIndexesStatistics.SchemaName, tmpIndexesStatistics.ObjectName, tmpIndexesStatistics.IndexName, tmpIndexesStatistics.StatisticsName, MIN(SelectedIndexes.StartPosition) AS StartPosition + FROM @tmpIndexesStatistics tmpIndexesStatistics + INNER JOIN @SelectedIndexes SelectedIndexes + ON @CurrentDatabaseName LIKE REPLACE(SelectedIndexes.DatabaseName,'_','[_]') AND tmpIndexesStatistics.SchemaName LIKE REPLACE(SelectedIndexes.SchemaName,'_','[_]') AND tmpIndexesStatistics.ObjectName LIKE REPLACE(SelectedIndexes.ObjectName,'_','[_]') AND COALESCE(tmpIndexesStatistics.IndexName,tmpIndexesStatistics.StatisticsName) LIKE REPLACE(SelectedIndexes.IndexName,'_','[_]') + WHERE SelectedIndexes.Selected = 1 + GROUP BY tmpIndexesStatistics.SchemaName, tmpIndexesStatistics.ObjectName, tmpIndexesStatistics.IndexName, tmpIndexesStatistics.StatisticsName) SelectedIndexes2 + ON tmpIndexesStatistics.SchemaName = SelectedIndexes2.SchemaName + AND tmpIndexesStatistics.ObjectName = SelectedIndexes2.ObjectName + AND (tmpIndexesStatistics.IndexName = SelectedIndexes2.IndexName OR tmpIndexesStatistics.IndexName IS NULL) + AND (tmpIndexesStatistics.StatisticsName = SelectedIndexes2.StatisticsName OR tmpIndexesStatistics.StatisticsName IS NULL) + END; + + WITH tmpIndexesStatistics AS ( + SELECT SchemaName, ObjectName, [Order], ROW_NUMBER() OVER (ORDER BY ISNULL(ResumableIndexOperation,0) DESC, StartPosition ASC, SchemaName ASC, ObjectName ASC, CASE WHEN IndexType IS NULL THEN 1 ELSE 0 END ASC, IndexType ASC, IndexName ASC, StatisticsName ASC, PartitionNumber ASC) AS RowNumber + FROM @tmpIndexesStatistics tmpIndexesStatistics + WHERE Selected = 1 + ) + UPDATE tmpIndexesStatistics + SET [Order] = RowNumber + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + '.' + QUOTENAME(SchemaName) + '.' + QUOTENAME(ObjectName) + ', ' + FROM @SelectedIndexes SelectedIndexes + WHERE DatabaseName = @CurrentDatabaseName + AND SchemaName NOT LIKE '%[%]%' + AND ObjectName NOT LIKE '%[%]%' + AND IndexName LIKE '%[%]%' + AND NOT EXISTS (SELECT * FROM @tmpIndexesStatistics WHERE SchemaName = SelectedIndexes.SchemaName AND ObjectName = SelectedIndexes.ObjectName) + IF @@ROWCOUNT > 0 + BEGIN + SET @ErrorMessage = 'The following objects in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT + SET @Error = @@ERROR + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + QUOTENAME(SchemaName) + '.' + QUOTENAME(ObjectName) + '.' + QUOTENAME(IndexName) + ', ' + FROM @SelectedIndexes SelectedIndexes + WHERE DatabaseName = @CurrentDatabaseName + AND SchemaName NOT LIKE '%[%]%' + AND ObjectName NOT LIKE '%[%]%' + AND IndexName NOT LIKE '%[%]%' + AND NOT EXISTS (SELECT * FROM @tmpIndexesStatistics WHERE SchemaName = SelectedIndexes.SchemaName AND ObjectName = SelectedIndexes.ObjectName AND IndexName = SelectedIndexes.IndexName) + IF @@ROWCOUNT > 0 + BEGIN + SET @ErrorMessage = 'The following indexes in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT + SET @Error = @@ERROR + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + END + + WHILE (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SELECT TOP 1 @CurrentIxID = ID, + @CurrentIxOrder = [Order], + @CurrentSchemaID = SchemaID, + @CurrentSchemaName = SchemaName, + @CurrentObjectID = ObjectID, + @CurrentObjectName = ObjectName, + @CurrentObjectType = ObjectType, + @CurrentIsMemoryOptimized = IsMemoryOptimized, + @CurrentIndexID = IndexID, + @CurrentIndexName = IndexName, + @CurrentIndexType = IndexType, + @CurrentAllowPageLocks = AllowPageLocks, + @CurrentIsImageText = IsImageText, + @CurrentIsNewLOB = IsNewLOB, + @CurrentIsFileStream = IsFileStream, + @CurrentIsColumnStore = IsColumnStore, + @CurrentIsComputed = IsComputed, + @CurrentIsTimestamp = IsTimestamp, + @CurrentOnReadOnlyFileGroup = OnReadOnlyFileGroup, + @CurrentResumableIndexOperation = ResumableIndexOperation, + @CurrentStatisticsID = StatisticsID, + @CurrentStatisticsName = StatisticsName, + @CurrentNoRecompute = [NoRecompute], + @CurrentIsIncremental = IsIncremental, + @CurrentPartitionID = PartitionID, + @CurrentPartitionNumber = PartitionNumber, + @CurrentPartitionCount = PartitionCount + FROM @tmpIndexesStatistics + WHERE Selected = 1 + AND Completed = 0 + ORDER BY [Order] ASC + + IF @@ROWCOUNT = 0 + BEGIN + BREAK + END + + -- Is the index a partition? + IF @CurrentPartitionNumber IS NULL OR @CurrentPartitionCount = 1 BEGIN SET @CurrentIsPartition = 0 END ELSE BEGIN SET @CurrentIsPartition = 1 END + + -- Does the index exist? + IF @CurrentIndexID IS NOT NULL AND EXISTS(SELECT * FROM @ActionsPreferred) + BEGIN + SET @CurrentCommand = '' + + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + + IF @CurrentIsPartition = 0 SET @CurrentCommand += 'IF EXISTS(SELECT * FROM sys.indexes indexes INNER JOIN sys.objects objects ON indexes.[object_id] = objects.[object_id] INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] IN(''U'',''V'') AND indexes.[type] IN(1,2,3,4,5,6,7) AND indexes.is_disabled = 0 AND indexes.is_hypothetical = 0 AND schemas.[schema_id] = @ParamSchemaID AND schemas.[name] = @ParamSchemaName AND objects.[object_id] = @ParamObjectID AND objects.[name] = @ParamObjectName AND objects.[type] = @ParamObjectType AND indexes.index_id = @ParamIndexID AND indexes.[name] = @ParamIndexName AND indexes.[type] = @ParamIndexType) BEGIN SET @ParamIndexExists = 1 END' + IF @CurrentIsPartition = 1 SET @CurrentCommand += 'IF EXISTS(SELECT * FROM sys.indexes indexes INNER JOIN sys.objects objects ON indexes.[object_id] = objects.[object_id] INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] INNER JOIN sys.partitions partitions ON indexes.[object_id] = partitions.[object_id] AND indexes.index_id = partitions.index_id WHERE objects.[type] IN(''U'',''V'') AND indexes.[type] IN(1,2,3,4,5,6,7) AND indexes.is_disabled = 0 AND indexes.is_hypothetical = 0 AND schemas.[schema_id] = @ParamSchemaID AND schemas.[name] = @ParamSchemaName AND objects.[object_id] = @ParamObjectID AND objects.[name] = @ParamObjectName AND objects.[type] = @ParamObjectType AND indexes.index_id = @ParamIndexID AND indexes.[name] = @ParamIndexName AND indexes.[type] = @ParamIndexType AND partitions.partition_id = @ParamPartitionID AND partitions.partition_number = @ParamPartitionNumber) BEGIN SET @ParamIndexExists = 1 END' + + BEGIN TRY + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand, @params = N'@ParamSchemaID int, @ParamSchemaName sysname, @ParamObjectID int, @ParamObjectName sysname, @ParamObjectType sysname, @ParamIndexID int, @ParamIndexName sysname, @ParamIndexType int, @ParamPartitionID bigint, @ParamPartitionNumber int, @ParamIndexExists bit OUTPUT', @ParamSchemaID = @CurrentSchemaID, @ParamSchemaName = @CurrentSchemaName, @ParamObjectID = @CurrentObjectID, @ParamObjectName = @CurrentObjectName, @ParamObjectType = @CurrentObjectType, @ParamIndexID = @CurrentIndexID, @ParamIndexName = @CurrentIndexName, @ParamIndexType = @CurrentIndexType, @ParamPartitionID = @CurrentPartitionID, @ParamPartitionNumber = @CurrentPartitionNumber, @ParamIndexExists = @CurrentIndexExists OUTPUT + + IF @CurrentIndexExists IS NULL + BEGIN + SET @CurrentIndexExists = 0 + GOTO NoAction + END + END TRY + BEGIN CATCH + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The index ' + QUOTENAME(@CurrentIndexName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. It could not be checked if the index exists.' ELSE '' END + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + + GOTO NoAction + END CATCH + END + + -- Does the statistics exist? + IF @CurrentStatisticsID IS NOT NULL AND @UpdateStatistics IS NOT NULL + BEGIN + SET @CurrentCommand = '' + + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + + SET @CurrentCommand += 'IF EXISTS(SELECT * FROM sys.stats stats INNER JOIN sys.objects objects ON stats.[object_id] = objects.[object_id] INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] IN(''U'',''V'')' + CASE WHEN @MSShippedObjects = 'N' THEN ' AND objects.is_ms_shipped = 0' ELSE '' END + ' AND schemas.[schema_id] = @ParamSchemaID AND schemas.[name] = @ParamSchemaName AND objects.[object_id] = @ParamObjectID AND objects.[name] = @ParamObjectName AND objects.[type] = @ParamObjectType AND stats.stats_id = @ParamStatisticsID AND stats.[name] = @ParamStatisticsName) BEGIN SET @ParamStatisticsExists = 1 END' + + BEGIN TRY + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand, @params = N'@ParamSchemaID int, @ParamSchemaName sysname, @ParamObjectID int, @ParamObjectName sysname, @ParamObjectType sysname, @ParamStatisticsID int, @ParamStatisticsName sysname, @ParamStatisticsExists bit OUTPUT', @ParamSchemaID = @CurrentSchemaID, @ParamSchemaName = @CurrentSchemaName, @ParamObjectID = @CurrentObjectID, @ParamObjectName = @CurrentObjectName, @ParamObjectType = @CurrentObjectType, @ParamStatisticsID = @CurrentStatisticsID, @ParamStatisticsName = @CurrentStatisticsName, @ParamStatisticsExists = @CurrentStatisticsExists OUTPUT + + IF @CurrentStatisticsExists IS NULL + BEGIN + SET @CurrentStatisticsExists = 0 + GOTO NoAction + END + END TRY + BEGIN CATCH + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The statistics ' + QUOTENAME(@CurrentStatisticsName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. It could not be checked if the statistics exists.' ELSE '' END + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + + GOTO NoAction + END CATCH + END + + -- Has the data in the statistics been modified since the statistics was last updated? + IF @CurrentStatisticsID IS NOT NULL AND @UpdateStatistics IS NOT NULL + BEGIN + SET @CurrentCommand = '' + + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + + IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1 + BEGIN + SET @CurrentCommand += 'SELECT @ParamRowCount = [rows], @ParamModificationCounter = modification_counter FROM sys.dm_db_incremental_stats_properties (@ParamObjectID, @ParamStatisticsID) WHERE partition_number = @ParamPartitionNumber' + END + ELSE + IF (@Version >= 10.504000 AND @Version < 11) OR @Version >= 11.03000 + BEGIN + SET @CurrentCommand += 'SELECT @ParamRowCount = [rows], @ParamModificationCounter = modification_counter FROM sys.dm_db_stats_properties (@ParamObjectID, @ParamStatisticsID)' + END + ELSE + BEGIN + SET @CurrentCommand += 'SELECT @ParamRowCount = rowcnt, @ParamModificationCounter = rowmodctr FROM sys.sysindexes sysindexes WHERE sysindexes.[id] = @ParamObjectID AND sysindexes.[indid] = @ParamStatisticsID' + END + + BEGIN TRY + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand, @params = N'@ParamObjectID int, @ParamStatisticsID int, @ParamPartitionNumber int, @ParamRowCount bigint OUTPUT, @ParamModificationCounter bigint OUTPUT', @ParamObjectID = @CurrentObjectID, @ParamStatisticsID = @CurrentStatisticsID, @ParamPartitionNumber = @CurrentPartitionNumber, @ParamRowCount = @CurrentRowCount OUTPUT, @ParamModificationCounter = @CurrentModificationCounter OUTPUT + + IF @CurrentRowCount IS NULL SET @CurrentRowCount = 0 + IF @CurrentModificationCounter IS NULL SET @CurrentModificationCounter = 0 + END TRY + BEGIN CATCH + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The statistics ' + QUOTENAME(@CurrentStatisticsName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. The rows and modification_counter could not be checked.' ELSE '' END + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + + GOTO NoAction + END CATCH + END + + -- Is the index fragmented? + IF @CurrentIndexID IS NOT NULL + AND @CurrentOnReadOnlyFileGroup = 0 + AND EXISTS(SELECT * FROM @ActionsPreferred) + AND (EXISTS(SELECT [Priority], [Action], COUNT(*) FROM @ActionsPreferred GROUP BY [Priority], [Action] HAVING COUNT(*) <> 3) OR @MinNumberOfPages > 0 OR @MaxNumberOfPages IS NOT NULL) + BEGIN + SET @CurrentCommand = '' + + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + + SET @CurrentCommand += 'SELECT @ParamFragmentationLevel = MAX(avg_fragmentation_in_percent), @ParamPageCount = SUM(page_count) FROM sys.dm_db_index_physical_stats(DB_ID(@ParamDatabaseName), @ParamObjectID, @ParamIndexID, @ParamPartitionNumber, ''LIMITED'') WHERE alloc_unit_type_desc = ''IN_ROW_DATA'' AND index_level = 0' + + BEGIN TRY + EXECUTE sp_executesql @stmt = @CurrentCommand, @params = N'@ParamDatabaseName nvarchar(max), @ParamObjectID int, @ParamIndexID int, @ParamPartitionNumber int, @ParamFragmentationLevel float OUTPUT, @ParamPageCount bigint OUTPUT', @ParamDatabaseName = @CurrentDatabaseName, @ParamObjectID = @CurrentObjectID, @ParamIndexID = @CurrentIndexID, @ParamPartitionNumber = @CurrentPartitionNumber, @ParamFragmentationLevel = @CurrentFragmentationLevel OUTPUT, @ParamPageCount = @CurrentPageCount OUTPUT + END TRY + BEGIN CATCH + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The index ' + QUOTENAME(@CurrentIndexName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. The page_count and avg_fragmentation_in_percent could not be checked.' ELSE '' END + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + + GOTO NoAction + END CATCH + END + + -- Select fragmentation group + IF @CurrentIndexID IS NOT NULL AND @CurrentOnReadOnlyFileGroup = 0 AND EXISTS(SELECT * FROM @ActionsPreferred) + BEGIN + SET @CurrentFragmentationGroup = CASE + WHEN @CurrentFragmentationLevel >= @FragmentationLevel2 THEN 'High' + WHEN @CurrentFragmentationLevel >= @FragmentationLevel1 AND @CurrentFragmentationLevel < @FragmentationLevel2 THEN 'Medium' + WHEN @CurrentFragmentationLevel < @FragmentationLevel1 THEN 'Low' + END + END + + -- Which actions are allowed? + IF @CurrentIndexID IS NOT NULL AND EXISTS(SELECT * FROM @ActionsPreferred) + BEGIN + IF @CurrentOnReadOnlyFileGroup = 0 AND @CurrentIndexType IN (1,2,3,4,5) AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL) AND (@CurrentAllowPageLocks = 1 OR @CurrentIndexType = 5) + BEGIN + INSERT INTO @CurrentActionsAllowed ([Action]) + VALUES ('INDEX_REORGANIZE') + END + IF @CurrentOnReadOnlyFileGroup = 0 AND @CurrentIndexType IN (1,2,3,4,5) AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL) + BEGIN + INSERT INTO @CurrentActionsAllowed ([Action]) + VALUES ('INDEX_REBUILD_OFFLINE') + END + IF @CurrentOnReadOnlyFileGroup = 0 + AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL) + AND (@CurrentIsPartition = 0 OR @Version >= 12) + AND ((@CurrentIndexType = 1 AND @CurrentIsImageText = 0 AND @CurrentIsNewLOB = 0) + OR (@CurrentIndexType = 2 AND @CurrentIsNewLOB = 0) + OR (@CurrentIndexType = 1 AND @CurrentIsImageText = 0 AND @CurrentIsFileStream = 0 AND @Version >= 11) + OR (@CurrentIndexType = 2 AND @Version >= 11)) + AND (@CurrentIsColumnStore = 0 OR @Version < 11) + AND SERVERPROPERTY('EngineEdition') IN (3,5,8) + BEGIN + INSERT INTO @CurrentActionsAllowed ([Action]) + VALUES ('INDEX_REBUILD_ONLINE') + END + END + + -- Decide action + IF @CurrentIndexID IS NOT NULL + AND EXISTS(SELECT * FROM @ActionsPreferred) + AND (@CurrentPageCount >= @MinNumberOfPages OR @MinNumberOfPages = 0) + AND (@CurrentPageCount <= @MaxNumberOfPages OR @MaxNumberOfPages IS NULL) + AND @CurrentResumableIndexOperation = 0 + BEGIN + IF EXISTS(SELECT [Priority], [Action], COUNT(*) FROM @ActionsPreferred GROUP BY [Priority], [Action] HAVING COUNT(*) <> 3) + BEGIN + SELECT @CurrentAction = [Action] + FROM @ActionsPreferred + WHERE FragmentationGroup = @CurrentFragmentationGroup + AND [Priority] = (SELECT MIN([Priority]) + FROM @ActionsPreferred + WHERE FragmentationGroup = @CurrentFragmentationGroup + AND [Action] IN (SELECT [Action] FROM @CurrentActionsAllowed)) + END + ELSE + BEGIN + SELECT @CurrentAction = [Action] + FROM @ActionsPreferred + WHERE [Priority] = (SELECT MIN([Priority]) + FROM @ActionsPreferred + WHERE [Action] IN (SELECT [Action] FROM @CurrentActionsAllowed)) + END + END + + IF @CurrentResumableIndexOperation = 1 + BEGIN + SET @CurrentAction = 'INDEX_REBUILD_ONLINE' + END + + -- Workaround for limitation in SQL Server, http://support.microsoft.com/kb/2292737 + IF @CurrentIndexID IS NOT NULL + BEGIN + SET @CurrentMaxDOP = @MaxDOP + + IF @CurrentAction = 'INDEX_REBUILD_ONLINE' AND @CurrentAllowPageLocks = 0 + BEGIN + SET @CurrentMaxDOP = 1 + END + END + + -- Update statistics? + IF @CurrentStatisticsID IS NOT NULL + AND ((@UpdateStatistics = 'ALL' AND (@CurrentIndexType IN (1,2,3,4,7) OR @CurrentIndexID IS NULL)) OR (@UpdateStatistics = 'INDEX' AND @CurrentIndexID IS NOT NULL AND @CurrentIndexType IN (1,2,3,4,7)) OR (@UpdateStatistics = 'COLUMNS' AND @CurrentIndexID IS NULL)) + AND ((@OnlyModifiedStatistics = 'N' AND @StatisticsModificationLevel IS NULL) OR (@OnlyModifiedStatistics = 'Y' AND @CurrentModificationCounter > 0) OR ((@CurrentModificationCounter * 1. / NULLIF(@CurrentRowCount,0)) * 100 >= @StatisticsModificationLevel) OR (@StatisticsModificationLevel IS NOT NULL AND @CurrentModificationCounter > 0 AND (@CurrentModificationCounter >= SQRT(@CurrentRowCount * 1000))) OR (@CurrentIsMemoryOptimized = 1 AND NOT (@Version >= 13 OR SERVERPROPERTY('EngineEdition') IN (5,8)))) + AND ((@CurrentIsPartition = 0 AND (@CurrentAction NOT IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') OR @CurrentAction IS NULL)) OR (@CurrentIsPartition = 1 AND (@CurrentPartitionNumber = @CurrentPartitionCount OR (@PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1)))) + BEGIN + SET @CurrentUpdateStatistics = 'Y' + END + ELSE + BEGIN + SET @CurrentUpdateStatistics = 'N' + END + + SET @CurrentStatisticsSample = @StatisticsSample + SET @CurrentStatisticsResample = @StatisticsResample + + -- Memory-optimized tables only supports FULLSCAN and RESAMPLE in SQL Server 2014 + IF @CurrentIsMemoryOptimized = 1 AND NOT (@Version >= 13 OR SERVERPROPERTY('EngineEdition') IN (5,8)) AND (@CurrentStatisticsSample <> 100 OR @CurrentStatisticsSample IS NULL) + BEGIN + SET @CurrentStatisticsSample = NULL + SET @CurrentStatisticsResample = 'Y' + END + + -- Incremental statistics only supports RESAMPLE + IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1 + BEGIN + SET @CurrentStatisticsSample = NULL + SET @CurrentStatisticsResample = 'Y' + END + + -- Create index comment + IF @CurrentIndexID IS NOT NULL + BEGIN + SET @CurrentComment = 'ObjectType: ' + CASE WHEN @CurrentObjectType = 'U' THEN 'Table' WHEN @CurrentObjectType = 'V' THEN 'View' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'IndexType: ' + CASE WHEN @CurrentIndexType = 1 THEN 'Clustered' WHEN @CurrentIndexType = 2 THEN 'NonClustered' WHEN @CurrentIndexType = 3 THEN 'XML' WHEN @CurrentIndexType = 4 THEN 'Spatial' WHEN @CurrentIndexType = 5 THEN 'Clustered Columnstore' WHEN @CurrentIndexType = 6 THEN 'NonClustered Columnstore' WHEN @CurrentIndexType = 7 THEN 'NonClustered Hash' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'ImageText: ' + CASE WHEN @CurrentIsImageText = 1 THEN 'Yes' WHEN @CurrentIsImageText = 0 THEN 'No' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'NewLOB: ' + CASE WHEN @CurrentIsNewLOB = 1 THEN 'Yes' WHEN @CurrentIsNewLOB = 0 THEN 'No' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'FileStream: ' + CASE WHEN @CurrentIsFileStream = 1 THEN 'Yes' WHEN @CurrentIsFileStream = 0 THEN 'No' ELSE 'N/A' END + ', ' + IF @Version >= 11 SET @CurrentComment += 'ColumnStore: ' + CASE WHEN @CurrentIsColumnStore = 1 THEN 'Yes' WHEN @CurrentIsColumnStore = 0 THEN 'No' ELSE 'N/A' END + ', ' + IF @Version >= 14 AND @Resumable = 'Y' SET @CurrentComment += 'Computed: ' + CASE WHEN @CurrentIsComputed = 1 THEN 'Yes' WHEN @CurrentIsComputed = 0 THEN 'No' ELSE 'N/A' END + ', ' + IF @Version >= 14 AND @Resumable = 'Y' SET @CurrentComment += 'Timestamp: ' + CASE WHEN @CurrentIsTimestamp = 1 THEN 'Yes' WHEN @CurrentIsTimestamp = 0 THEN 'No' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'AllowPageLocks: ' + CASE WHEN @CurrentAllowPageLocks = 1 THEN 'Yes' WHEN @CurrentAllowPageLocks = 0 THEN 'No' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'PageCount: ' + ISNULL(CAST(@CurrentPageCount AS nvarchar),'N/A') + ', ' + SET @CurrentComment += 'Fragmentation: ' + ISNULL(CAST(@CurrentFragmentationLevel AS nvarchar),'N/A') + END + + IF @CurrentIndexID IS NOT NULL AND (@CurrentPageCount IS NOT NULL OR @CurrentFragmentationLevel IS NOT NULL) + BEGIN + SET @CurrentExtendedInfo = (SELECT * + FROM (SELECT CAST(@CurrentPageCount AS nvarchar) AS [PageCount], + CAST(@CurrentFragmentationLevel AS nvarchar) AS Fragmentation + ) ExtendedInfo FOR XML RAW('ExtendedInfo'), ELEMENTS) + END + + IF @CurrentIndexID IS NOT NULL AND @CurrentAction IS NOT NULL AND (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SET @CurrentDatabaseContext = @CurrentDatabaseName + + SET @CurrentCommandType = 'ALTER_INDEX' + + SET @CurrentCommand = '' + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + SET @CurrentCommand += 'ALTER INDEX ' + QUOTENAME(@CurrentIndexName) + ' ON ' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + IF @CurrentResumableIndexOperation = 1 SET @CurrentCommand += ' RESUME' + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand += ' REBUILD' + IF @CurrentAction IN('INDEX_REORGANIZE') AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand += ' REORGANIZE' + IF @CurrentIsPartition = 1 AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand += ' PARTITION = ' + CAST(@CurrentPartitionNumber AS nvarchar) + + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @SortInTempdb = 'Y' AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'SORT_IN_TEMPDB = ON' + END + + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @SortInTempdb = 'N' AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'SORT_IN_TEMPDB = OFF' + END + + IF @CurrentAction = 'INDEX_REBUILD_ONLINE' AND (@CurrentIsPartition = 0 OR @Version >= 12) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'ONLINE = ON' + CASE WHEN @WaitAtLowPriorityMaxDuration IS NOT NULL THEN ' (WAIT_AT_LOW_PRIORITY (MAX_DURATION = ' + CAST(@WaitAtLowPriorityMaxDuration AS nvarchar) + ', ABORT_AFTER_WAIT = ' + UPPER(@WaitAtLowPriorityAbortAfterWait) + '))' ELSE '' END + END + + IF @CurrentAction = 'INDEX_REBUILD_OFFLINE' AND (@CurrentIsPartition = 0 OR @Version >= 12) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'ONLINE = OFF' + END + + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @CurrentMaxDOP IS NOT NULL + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'MAXDOP = ' + CAST(@CurrentMaxDOP AS nvarchar) + END + + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @FillFactor IS NOT NULL AND @CurrentIsPartition = 0 AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'FILLFACTOR = ' + CAST(@FillFactor AS nvarchar) + END + + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @PadIndex = 'Y' AND @CurrentIsPartition = 0 AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'PAD_INDEX = ON' + END + + IF (@Version >= 14 OR SERVERPROPERTY('EngineEdition') IN (5,8)) AND @CurrentAction = 'INDEX_REBUILD_ONLINE' AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT CASE WHEN @Resumable = 'Y' AND @CurrentIndexType IN(1,2) AND @CurrentIsComputed = 0 AND @CurrentIsTimestamp = 0 THEN 'RESUMABLE = ON' ELSE 'RESUMABLE = OFF' END + END + + IF (@Version >= 14 OR SERVERPROPERTY('EngineEdition') IN (5,8)) AND @CurrentAction = 'INDEX_REBUILD_ONLINE' AND @CurrentResumableIndexOperation = 0 AND @Resumable = 'Y' AND @CurrentIndexType IN(1,2) AND @CurrentIsComputed = 0 AND @CurrentIsTimestamp = 0 AND @TimeLimit IS NOT NULL + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'MAX_DURATION = ' + CAST(DATEDIFF(MINUTE,SYSDATETIME(),DATEADD(SECOND,@TimeLimit,@StartTime)) AS nvarchar(max)) + END + + IF @CurrentAction IN('INDEX_REORGANIZE') AND @LOBCompaction = 'Y' + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'LOB_COMPACTION = ON' + END + + IF @CurrentAction IN('INDEX_REORGANIZE') AND @LOBCompaction = 'N' + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'LOB_COMPACTION = OFF' + END + + IF EXISTS (SELECT * FROM @CurrentAlterIndexWithClauseArguments) + BEGIN + SET @CurrentAlterIndexWithClause = ' WITH (' + + WHILE (1 = 1) + BEGIN + SELECT TOP 1 @CurrentAlterIndexArgumentID = ID, + @CurrentAlterIndexArgument = Argument + FROM @CurrentAlterIndexWithClauseArguments + WHERE Added = 0 + ORDER BY ID ASC + + IF @@ROWCOUNT = 0 + BEGIN + BREAK + END + + SET @CurrentAlterIndexWithClause += @CurrentAlterIndexArgument + ', ' + + UPDATE @CurrentAlterIndexWithClauseArguments + SET Added = 1 + WHERE [ID] = @CurrentAlterIndexArgumentID + END + + SET @CurrentAlterIndexWithClause = RTRIM(@CurrentAlterIndexWithClause) + + SET @CurrentAlterIndexWithClause = LEFT(@CurrentAlterIndexWithClause,LEN(@CurrentAlterIndexWithClause) - 1) + + SET @CurrentAlterIndexWithClause = @CurrentAlterIndexWithClause + ')' + END + + IF @CurrentAlterIndexWithClause IS NOT NULL SET @CurrentCommand += @CurrentAlterIndexWithClause + + EXECUTE @CurrentCommandOutput = dbo.CommandExecute @DatabaseContext = @CurrentDatabaseName, @Command = @CurrentCommand, @CommandType = @CurrentCommandType, @Mode = 2, @Comment = @CurrentComment, @DatabaseName = @CurrentDatabaseName, @SchemaName = @CurrentSchemaName, @ObjectName = @CurrentObjectName, @ObjectType = @CurrentObjectType, @IndexName = @CurrentIndexName, @IndexType = @CurrentIndexType, @PartitionNumber = @CurrentPartitionNumber, @ExtendedInfo = @CurrentExtendedInfo, @LockMessageSeverity = @LockMessageSeverity, @LogToTable = @LogToTable, @Execute = @Execute + SET @Error = @@ERROR + IF @Error <> 0 SET @CurrentCommandOutput = @Error + IF @CurrentCommandOutput <> 0 SET @ReturnCode = @CurrentCommandOutput + + IF @Delay > 0 + BEGIN + SET @CurrentDelay = DATEADD(ss,@Delay,'1900-01-01') + WAITFOR DELAY @CurrentDelay + END + END + + SET @CurrentMaxDOP = @MaxDOP + + -- Create statistics comment + IF @CurrentStatisticsID IS NOT NULL + BEGIN + SET @CurrentComment = 'ObjectType: ' + CASE WHEN @CurrentObjectType = 'U' THEN 'Table' WHEN @CurrentObjectType = 'V' THEN 'View' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'IndexType: ' + CASE WHEN @CurrentIndexID IS NOT NULL THEN 'Index' ELSE 'Column' END + ', ' + IF @CurrentIndexID IS NOT NULL SET @CurrentComment += 'IndexType: ' + CASE WHEN @CurrentIndexType = 1 THEN 'Clustered' WHEN @CurrentIndexType = 2 THEN 'NonClustered' WHEN @CurrentIndexType = 3 THEN 'XML' WHEN @CurrentIndexType = 4 THEN 'Spatial' WHEN @CurrentIndexType = 5 THEN 'Clustered Columnstore' WHEN @CurrentIndexType = 6 THEN 'NonClustered Columnstore' WHEN @CurrentIndexType = 7 THEN 'NonClustered Hash' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'Incremental: ' + CASE WHEN @CurrentIsIncremental = 1 THEN 'Y' WHEN @CurrentIsIncremental = 0 THEN 'N' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'RowCount: ' + ISNULL(CAST(@CurrentRowCount AS nvarchar),'N/A') + ', ' + SET @CurrentComment += 'ModificationCounter: ' + ISNULL(CAST(@CurrentModificationCounter AS nvarchar),'N/A') + END + + IF @CurrentStatisticsID IS NOT NULL AND (@CurrentRowCount IS NOT NULL OR @CurrentModificationCounter IS NOT NULL) + BEGIN + SET @CurrentExtendedInfo = (SELECT * + FROM (SELECT CAST(@CurrentRowCount AS nvarchar) AS [RowCount], + CAST(@CurrentModificationCounter AS nvarchar) AS ModificationCounter + ) ExtendedInfo FOR XML RAW('ExtendedInfo'), ELEMENTS) + END + + IF @CurrentStatisticsID IS NOT NULL AND @CurrentUpdateStatistics = 'Y' AND (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SET @CurrentDatabaseContext = @CurrentDatabaseName + + SET @CurrentCommandType = 'UPDATE_STATISTICS' + + SET @CurrentCommand = '' + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + SET @CurrentCommand += 'UPDATE STATISTICS ' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' ' + QUOTENAME(@CurrentStatisticsName) + + IF @CurrentMaxDOP IS NOT NULL AND ((@Version >= 12.06024 AND @Version < 13) OR (@Version >= 13.05026 AND @Version < 14) OR @Version >= 14.030154) + BEGIN + INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument) + SELECT 'MAXDOP = ' + CAST(@CurrentMaxDOP AS nvarchar) + END + + IF @CurrentStatisticsSample = 100 + BEGIN + INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument) + SELECT 'FULLSCAN' + END + + IF @CurrentStatisticsSample IS NOT NULL AND @CurrentStatisticsSample <> 100 + BEGIN + INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument) + SELECT 'SAMPLE ' + CAST(@CurrentStatisticsSample AS nvarchar) + ' PERCENT' + END + + IF @CurrentStatisticsResample = 'Y' + BEGIN + INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument) + SELECT 'RESAMPLE' + END + + IF @CurrentNoRecompute = 1 + BEGIN + INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument) + SELECT 'NORECOMPUTE' + END + + IF EXISTS (SELECT * FROM @CurrentUpdateStatisticsWithClauseArguments) + BEGIN + SET @CurrentUpdateStatisticsWithClause = ' WITH' + + WHILE (1 = 1) + BEGIN + SELECT TOP 1 @CurrentUpdateStatisticsArgumentID = ID, + @CurrentUpdateStatisticsArgument = Argument + FROM @CurrentUpdateStatisticsWithClauseArguments + WHERE Added = 0 + ORDER BY ID ASC + + IF @@ROWCOUNT = 0 + BEGIN + BREAK + END + + SET @CurrentUpdateStatisticsWithClause = @CurrentUpdateStatisticsWithClause + ' ' + @CurrentUpdateStatisticsArgument + ',' + + UPDATE @CurrentUpdateStatisticsWithClauseArguments + SET Added = 1 + WHERE [ID] = @CurrentUpdateStatisticsArgumentID + END + + SET @CurrentUpdateStatisticsWithClause = LEFT(@CurrentUpdateStatisticsWithClause,LEN(@CurrentUpdateStatisticsWithClause) - 1) + END + + IF @CurrentUpdateStatisticsWithClause IS NOT NULL SET @CurrentCommand += @CurrentUpdateStatisticsWithClause + + IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1 AND @CurrentPartitionNumber IS NOT NULL SET @CurrentCommand += ' ON PARTITIONS(' + CAST(@CurrentPartitionNumber AS nvarchar(max)) + ')' + + EXECUTE @CurrentCommandOutput = dbo.CommandExecute @DatabaseContext = @CurrentDatabaseName, @Command = @CurrentCommand, @CommandType = @CurrentCommandType, @Mode = 2, @Comment = @CurrentComment, @DatabaseName = @CurrentDatabaseName, @SchemaName = @CurrentSchemaName, @ObjectName = @CurrentObjectName, @ObjectType = @CurrentObjectType, @IndexName = @CurrentIndexName, @IndexType = @CurrentIndexType, @StatisticsName = @CurrentStatisticsName, @ExtendedInfo = @CurrentExtendedInfo, @LockMessageSeverity = @LockMessageSeverity, @LogToTable = @LogToTable, @Execute = @Execute + SET @Error = @@ERROR + IF @Error <> 0 SET @CurrentCommandOutput = @Error + IF @CurrentCommandOutput <> 0 SET @ReturnCode = @CurrentCommandOutput + END + + NoAction: + + -- Update that the index or statistics is completed + UPDATE @tmpIndexesStatistics + SET Completed = 1 + WHERE Selected = 1 + AND Completed = 0 + AND [Order] = @CurrentIxOrder + AND ID = @CurrentIxID + + -- Clear variables + SET @CurrentDatabaseContext = NULL + + SET @CurrentCommand = NULL + SET @CurrentCommandOutput = NULL + SET @CurrentCommandType = NULL + SET @CurrentComment = NULL + SET @CurrentExtendedInfo = NULL + + SET @CurrentIxID = NULL + SET @CurrentIxOrder = NULL + SET @CurrentSchemaID = NULL + SET @CurrentSchemaName = NULL + SET @CurrentObjectID = NULL + SET @CurrentObjectName = NULL + SET @CurrentObjectType = NULL + SET @CurrentIsMemoryOptimized = NULL + SET @CurrentIndexID = NULL + SET @CurrentIndexName = NULL + SET @CurrentIndexType = NULL + SET @CurrentStatisticsID = NULL + SET @CurrentStatisticsName = NULL + SET @CurrentPartitionID = NULL + SET @CurrentPartitionNumber = NULL + SET @CurrentPartitionCount = NULL + SET @CurrentIsPartition = NULL + SET @CurrentIndexExists = NULL + SET @CurrentStatisticsExists = NULL + SET @CurrentIsImageText = NULL + SET @CurrentIsNewLOB = NULL + SET @CurrentIsFileStream = NULL + SET @CurrentIsColumnStore = NULL + SET @CurrentIsComputed = NULL + SET @CurrentIsTimestamp = NULL + SET @CurrentAllowPageLocks = NULL + SET @CurrentNoRecompute = NULL + SET @CurrentIsIncremental = NULL + SET @CurrentRowCount = NULL + SET @CurrentModificationCounter = NULL + SET @CurrentOnReadOnlyFileGroup = NULL + SET @CurrentResumableIndexOperation = NULL + SET @CurrentFragmentationLevel = NULL + SET @CurrentPageCount = NULL + SET @CurrentFragmentationGroup = NULL + SET @CurrentAction = NULL + SET @CurrentMaxDOP = NULL + SET @CurrentUpdateStatistics = NULL + SET @CurrentStatisticsSample = NULL + SET @CurrentStatisticsResample = NULL + SET @CurrentAlterIndexArgumentID = NULL + SET @CurrentAlterIndexArgument = NULL + SET @CurrentAlterIndexWithClause = NULL + SET @CurrentUpdateStatisticsArgumentID = NULL + SET @CurrentUpdateStatisticsArgument = NULL + SET @CurrentUpdateStatisticsWithClause = NULL + + DELETE FROM @CurrentActionsAllowed + DELETE FROM @CurrentAlterIndexWithClauseArguments + DELETE FROM @CurrentUpdateStatisticsWithClauseArguments + + END + + END + + IF @CurrentDatabaseState = 'SUSPECT' + BEGIN + SET @ErrorMessage = 'The database ' + QUOTENAME(@CurrentDatabaseName) + ' is in a SUSPECT state.' + RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + SET @Error = @@ERROR + END + + -- Update that the database is completed + IF @DatabasesInParallel = 'Y' + BEGIN + UPDATE dbo.QueueDatabase + SET DatabaseEndTime = SYSDATETIME() + WHERE QueueID = @QueueID + AND DatabaseName = @CurrentDatabaseName + END + ELSE + BEGIN + UPDATE @tmpDatabases + SET Completed = 1 + WHERE Selected = 1 + AND Completed = 0 + AND ID = @CurrentDBID + END + + -- Clear variables + SET @CurrentDBID = NULL + SET @CurrentDatabaseName = NULL + + SET @CurrentDatabase_sp_executesql = NULL + + SET @CurrentUserAccess = NULL + SET @CurrentIsReadOnly = NULL + SET @CurrentDatabaseState = NULL + SET @CurrentInStandby = NULL + SET @CurrentRecoveryModel = NULL + + SET @CurrentIsDatabaseAccessible = NULL + SET @CurrentAvailabilityGroup = NULL + SET @CurrentAvailabilityGroupRole = NULL + SET @CurrentDatabaseMirroringRole = NULL + + SET @CurrentCommand = NULL + + DELETE FROM @tmpIndexesStatistics + + END + + ---------------------------------------------------------------------------------------------------- + --// Log completing information //-- + ---------------------------------------------------------------------------------------------------- + + Logging: + SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,SYSDATETIME(),120) + RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT + + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF @ReturnCode <> 0 + BEGIN + RETURN @ReturnCode + END + + ---------------------------------------------------------------------------------------------------- + +END + +GO + + + +EXECUTE master.[dbo].[IndexOptimize] +@Databases = 'USER_DATABASES', +@UpdateStatistics = 'ALL', +@StatisticsModificationLevel= '1' + +GO + +IF OBJECT_ID('dbo.IndexOptimize') IS NOT NULL + DROP PROCEDURE [dbo].[IndexOptimize] + +IF OBJECT_ID('dbo.CommandExecute') IS NOT NULL + drop PROCEDURE [dbo].[CommandExecute] \ No newline at end of file diff --git a/OCTPDBA-713 - global blue/deploy.sql b/OCTPDBA-713 - global blue/deploy.sql new file mode 100644 index 0000000..bf1f0a5 --- /dev/null +++ b/OCTPDBA-713 - global blue/deploy.sql @@ -0,0 +1,700 @@ +/* +OCTPDBA-713 :: Global Blue – Créer les WSAC de PROD pour 4 WSA (Web Services). + +Run this script on the central, following the plan in the US +first half of AMA on the 8th of august +second half of AMA on the 9th of august +all CVI on the 10 of august +all SUN on the 15th of august + +*/ + +USE [Arizona] +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED + +BEGIN TRANSACTION +SET XACT_ABORT ON; +SET NOCOUNT ON; + +--#region variables +DECLARE @dbg BIT = 0 --if 1, ignore the batch dates. for verifications only +DECLARE @ou_only AS VARCHAR(10) = NULL --'085' --ama085, for testing with 1 OU +DECLARE @phcy_code VARCHAR(20); +DECLARE @services TABLE( + name VARCHAR(200) NOT NULL, + id [GUID_identifier] null +); + +--if several pharmacy_code, take the most often present +SELECT TOP(1) @phcy_code = [WSAC_pharmacy_code] +FROM [dbo].[WSA_connection] +GROUP BY [WSAC_pharmacy_code] +ORDER BY COUNT(1) DESC + +IF OBJECT_ID('tempdb..#ocptdba_713')IS NOT NULL BEGIN; + DROP TABLE #ocptdba_713; +END; + +CREATE TABLE #ocptdba_713( + [ShopNr] [int] NULL, + [Alias (Format)] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [KST ] VARCHAR(20) NULL, + [ShopName] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [Address] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [ZIP] [int] NULL, + [Town] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [VATRegNr] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [Shop ID] [varchar](max) NULL, + [Desk ID] [varchar](max) NULL, + [Username] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [Password] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [Rechnungsadresse] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [E-Mail-Adresse für PDF-Versand] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [Bemerkungen] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [execution_date] datetime2(0) NULL, + [OU_code] VARCHAR(10) NULL , + [OU_id] INT NULL , + [skip_insert] BIT DEFAULT 0 NOT NULL + ,[encoded_password] VARCHAR(max) NULL +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] +--#endregion variables + +--#region populate services and fetch id's +INSERT INTO @services ([name]) +VALUES('apswsVatGlobalBlue'),('apswsVatGlobalBlueReprint'),('apswsVatGlobalBlueToken'),('apswsVatGlobalBlueVoid') +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - added web service references. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + +UPDATE s SET id = [ws].[Web_service_access_GUID] +FROM [dbo].[Web_service_access] ws + JOIN @services s ON s.[name] = ws.[WSA_code] +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - resolved web service id''s. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + +--#endregion populate services and fetch id's + +--#region excel datas +INSERT INTO #ocptdba_713 ([ShopNr], [Alias (Format)], [KST], [ShopName], [Address], [ZIP], [Town], [VATRegNr], [Shop ID], [Desk ID], Username, [Password], [Rechnungsadresse], [E-Mail-Adresse für PDF-Versand], [Bemerkungen]) +VALUES (NULL, NULL, 10313, N'ApoDoc Hardbrücke (Apotheke)', N'Hardstrasse 235', 8005, N'Zürich', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', N'Integration GlobalBlue frühestens ab 01.01.2024 möglich (NICHT TriaPHarm im Einsatz)'), + (NULL, NULL, 12102, N'Pharmacie Sun Store Petit-Chêne', N'Place de la Gare 10', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', N'Integration GlobalBlue frühestens ab 01.04.2023 möglich (Neueröffnung)'), + (NULL, NULL, 12103, N'Pharmacie Sun Store Porrentruy Millet-Gare', N'Rue Xavier-Stockmar 2', 2900, N'Porrentruy', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', N'Integration GlobalBlue möglich (Daten GlobalBlue fehlen noch)'), + (NULL, N'Amavita', 10098, N'Pharmacie Amavita Milliet-Ville', N'Grand-Rue 2', 2900, N'Porrentruy', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (NULL, N'Amavita', 10309, N'Amavita Adler Apotheke', N'Untertor 39 / Bahnhofplatz 2', 8400, N'Winterthur', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (NULL, N'Amavita', 10319, N'Amavita Apotheke Rathaus St. Gallen', N'Poststrasse 9', 9000, N'St. Gallen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (NULL, N'Amavita', 10330, N'Amavita Apotheke Boujean', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, N'Umbranding noch nicht offiziell…'), + (NULL, N'Amavita', 10331, N'Amavita Apotheke Center Biel', N'Bahnhofstrasse 16', 2502, N'Biel/Bienne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (NULL, N'Amavita', 10332, N'Amavita Apotheke Bahnhof Biel', N'Bahnhofplatz 4', 2502, N'Biel/Bienne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (NULL, N'Amavita', 10333, N'Amavita Apotheke Bethlehem Bern', N'Riedbachstrasse 8', 3027, N'Bern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (NULL, N'Amavita', 10334, N'Amavita Apotheke Storchengässchen Bern', N'Storchengässchen 6', 3011, N'Bern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (NULL, N'Amavita', 10335, N'Amavita Apotheke Binningen', N'Gorenmattstrasse 17', 4102, N'Binningen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (NULL, N'Amavita', 10336, N'Amavita Apotheke Bülach', N'Feldstrasse 85', 8180, N'Bülach', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (NULL, N'Amavita', 10337, N'Amavita Apotheke Ittigen', N'Talweg 6', 3063, N'Ittigen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (NULL, N'Amavita', 10338, N'Amavita Apotheke Löwenstrasse Zürich', N'Löwenstrasse 31-35', 8001, N'Zürich', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (NULL, N'Amavita', 10339, N'Amavita Apotheke Ostermundigen', N'Bernstrasse 114', 3072, N'Bern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', NULL, NULL, NULL, NULL, N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (4309, N'Amavita', 10258, N'Amavita Apotheke Corviglia', N'Via Maistra 11', 7500, N'St. Moritz', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762938, 1252478, N'MX756A4309', N'AMA@4309', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (7342, N'Amavita', 10293, N'Amavita Bahnhof Apotheke', N'Wannerhalle / Museumsstrasse 1', 8001, N'Zürich', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762876, 1252416, N'MX756A7342', N'AMA@7342', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (7846, N'Amavita', 10267, N'Amavita Apotheke Stadelhofen', N'Stadelhoferstrasse 8', 8001, N'Zürich', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762921, 1252461, N'MX756A7846', N'AMA@7846', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (7847, N'Amavita', 10268, N'Amavita Apotheke Erlibacher-Märt', N'Bahnhofstrasse 40', 8703, N'Erlenbach ZH', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762835, 1252375, N'MX756A7847', N'AMA@7847', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (7848, N'Amavita', 10269, N'Amavita Apotheke Bahnhof Wädenswil', N'Bahnhofstrasse 5', 8820, N'Wädenswil', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762836, 1252376, N'MX756A7848', N'AMA@7848', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (7850, N'Amavita', 10203, N'Amavita Apotheke Shoppyland', N'EKZ Shoppyland / Industriestrasse 10', 3321, N'Schönbühl', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762908, 1252448, N'MX756A7850', N'AMA@7850', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (7851, N'Amavita', 10273, N'Amavita Apotheke LöwenCenter', N'LöwenCenter / Zürichstrasse 5', 6004, N'Luzern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 739673, 1215488, N'MX756A7851', N'AMA@7851', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (7852, N'Amavita', 10274, N'Amavita Apotheke Shopville', N'Bahnhofpassage 15', 8001, N'Zürich', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762839, 1252379, N'MX756A7852', N'AMA@7852', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (7853, N'Amavita', 10275, N'Amavita Apotheke Sonnenhof', N'Einkaufszentrum Sonnenhof / Bahnhofstrasse 28', 8180, N'Bülach', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762840, 1252380, N'MX756A7853', N'AMA@7853', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8710, N'Coop Vitality', 21206, N'CV Basel am Marktplatz', N'Hutgasse 15', 4001, N'Basel', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763588, 1253828, N'MX756A8710', N'COO@8710', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8711, N'Coop Vitality', 21211, N'CV Bern Wankdorf', N'Wankdorf Center / Papiermühlestrasse 85', 3014, N'Bern', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763589, 1253829, N'MX756A8711', N'COO@8711', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8712, N'Coop Vitality', 21212, N'CV Bern Ryfflihof', N'Ryfflihof / Genfergasse 3', 3011, N'Bern', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763590, 1253830, N'MX756A8712', N'COO@8712', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8714, N'Coop Vitality', 21001, N'CV Crissier', N'Léman Centre / Chemin de Saugy 1', 1023, N'Crissier', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763592, 1253832, N'MX756A8714', N'COO@8714', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8715, N'Coop Vitality', 21002, N'CV Fontainemelon', N'Centre commercial / Avenue Robert 12', 2052, N'Fontainemelon', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763593, 1253833, N'MX756A8715', N'COO@8715', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8716, N'Coop Vitality', 21202, N'CV Kriens EKZ Schappe', N'Schappe Center / Obernauerstrasse 16', 6010, N'Kriens', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763594, 1253834, N'MX756A8716', N'COO@8716', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8718, N'Coop Vitality', 21207, N'CV Seewen', N'Seewen Markt / Steinbislin z', 6423, N'Seewen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763596, 1253836, N'MX756A8718', N'COO@8718', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8719, N'Coop Vitality', 21200, N'CV St. Gallen Neumarkt', N'Beim Neumarkt 4 / Vadianstrasse 25', 9000, N'St. Gallen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763597, 1253837, N'MX756A8719', N'COO@8719', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8721, N'Coop Vitality', 21500, N'CV Tenero', N'Centro Tenero / Via Brere 8', 6598, N'Tenero', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763599, 1253839, N'MX756A8721', N'COO@8721', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8722, N'Coop Vitality', 21501, N'CV Viganello', N'Via Molinazzo 1', 6962, N'Viganello', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763600, 1253840, N'MX756A8722', N'COO@8722', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8723, N'Coop Vitality', 21203, N'CV Volketswil Volkiland', N'Volkiland / Industriestrasse 1', 8604, N'Volketswil', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763601, 1253841, N'MX756A8723', N'COO@8723', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8724, N'Coop Vitality', 21208, N'CV Wettingen', N'Tägipark / Jurastrasse 42', 5430, N'Wettingen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763602, 1253842, N'MX756A8724', N'COO@8724', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8725, N'Coop Vitality', 21213, N'CV Winterthur Grüze', N'Grüze Markt / Rudolf-Diesel-Str. 19', 8404, N'Winterthur', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763603, 1253843, N'MX756A8725', N'COO@8725', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8726, N'Coop Vitality', 21210, N'CV Würenlingen', N'Im Aarepark / Kuhgässli 7', 5303, N'Würenlingen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763604, 1253844, N'MX756A8726', N'COO@8726', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8727, N'Coop Vitality', 21201, N'CV Zürich Bahnhofstrasse', N'Bahnhofstrasse 81', 8001, N'Zürich', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763605, 1253845, N'MX756A8727', N'COO@8727', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (8730, N'Coop Vitality', 21214, N'CV Grenchen', N'Centro / Bettlachstrasse 8', 2540, N'Grenchen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763606, 1253846, N'MX756A8730', N'COO@8730', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (9323, N'Coop Vitality', 21216, N'CV Zürich Sihl-City', N'Sihlcity / Kalanderplatz 1', 8045, N'Zürich', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763607, 1253847, N'MX756A9323', N'COO@9323', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (9522, N'Amavita', 10060, N'Pharmacie Amavita Chantepoulet', N'Rue Chantepoulet 21', 1201, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 94477, 1252492, N'MX756A9522', N'AMA@9522', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (9730, N'Amavita', 10244, N'Amavita Apotheke Flughafen', N'Airport Shopping', 8060, N'Zürich Flughafen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762912, 1252452, N'MX756A9730', N'AMA@9730', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (10736, N'Amavita', 10062, N'Pharmacie Amavita Gare Genève', N'Gare Cornavin', 1201, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 94471, 1252509, N'MX756A10736', N'AMA@10736', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (10991, N'Amavita', 10223, N'Amavita Apotheke Flüela', N'Bahnhofstrasse 1', 7260, N'Davos Dorf', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762934, 1252474, N'MX756A10991', N'AMA@10991', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (11606, N'Amavita', 10041, N'Pharmacie Amavita Confédération Centre', N'Rue de la Confédération 10', 1204, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762791, 1252331, N'MX756A11606', N'AMA@11606', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (11816, N'Amavita', 10063, N'Pharmacie Amavita Métro-Shopping', N'Rue du Mont-Blanc 30', 1201, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 83763, 1252510, N'MX756A11816', N'AMA@11816', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (11875, N'Amavita', 10067, N'Pharmacie Amavita Montreux', N'Avenue du Casino 53', 1820, N'Montreux', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 88698, 1211764, N'MX756A11875', N'AMA@11875', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (12231, N'Sun Store', 12041, N'Pharmacie Sun Store Genève Aéroport', N'Case postale 769 / Route de l''Aéroport 25', 1215, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763481, 1253719, N'MX756A12231', N'SUN@12231', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (12248, N'Sun Store', 12059, N'Pharmacie Sun Store Montreux', N'Place du Marché 6', 1820, N'Montreux', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763482, 1253720, N'MX756A12248', N'SUN@12248', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (12275, N'Amavita', 10259, N'Amavita Apotheke Bahnhofstrasse Zürich', N'Bahnhofstrasse 108', 8001, N'Zürich', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762829, 1252369, N'MX756A12275', N'AMA@12275', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (12440, N'Sun Store', 12076, N'Pharmacie Sun Store Lausanne St-François Poste', N'Place Saint-François 15', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763484, 1253722, N'MX756A12440', N'SUN@12440', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (12583, N'Sun Store', 12080, N'Pharmacie Sun Store Morges Migros', N'Rue de la Gare 19 ', 1110, N'Morges', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763485, 1253723, N'MX756A12583', N'SUN@12583', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13220, N'Sun Store', 12075, N'Pharmacie Sun Store Lausanne Grand-Pont', N'Rue du Grand-Pont 18', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763487, 1253725, N'MX756A13220', N'SUN@13220', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13221, N'Sun Store', 12065, N'Pharmacie Sun Store Prilly Malley', N'Ch. du Viaduc 1', 1008, N'Prilly-Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763488, 1253726, N'MX756A13221', N'SUN@13221', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13222, N'Amavita', 10061, N'Pharmacie Amavita Florissant', N'Rte de Florissant 70', 1206, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762911, 1252451, N'MX756A13222', N'AMA@13222', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13223, N'Amavita', 10037, N'Amavita Wellness Florissant', N'Rte de Florissant 61', 1206, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762788, 1252328, N'MX756A13223', N'AMA@13223', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13224, N'Amavita', 10080, N'Pharmacie Amavita Golaz', N'Place St-François 5', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762864, 1252404, N'MX756A13224', N'AMA@13224', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13274, N'Amavita', 10040, N'Pharmacie Amavita Bagnoud', N'Centre Migros / Route de Rawyl 32', 3963, N'Crans-Montana 2', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762906, 1252446, N'MX75613274', N'AMA@13274', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13276, N'Sun Store', 12500, N'Farmacia Sun Store Lugano Peri', N'Via Peri 5', 6900, N'Lugano', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763489, 1253727, N'MX756A13276', N'SUN@13276', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13302, N'Sun Store', 12099, N'Pharmacie Sun Store Genève Wilson', N'Rue des Pâquis 41', 1201, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763486, 1253724, N'MX756A13302', N'SUN@13302', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13607, N'Amavita', 10068, N'Pharmacie Amavita Gland', N'Rue du Borgeaud 1a', 1196, N'Gland', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762945, 1252485, N'MX756A13607', N'AMA@13607', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13620, N'Amavita', 10206, N'Amavita Apotheke Kongress', N'Promenade 50', 7270, N'Davos Platz', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762920, 1252460, N'MX756A13620', N'AMA@13620', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13871, N'Amavita', 10294, N'Amavita Apotheke Pratteln', N'Burggartenstrasse 21', 4133, N'Pratteln', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762873, 1252413, N'MX756A13871', N'AMA@13871', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13872, N'Amavita', 10295, N'Amavita Apotheke Bahnhof Pratteln', N'Bahnhofstrasse 3', 4133, N'Pratteln', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762874, 1252414, N'MX756A13872', N'AMA@13872', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13873, N'Amavita', 10296, N'Amavita Apotheke Gundeli', N'Dornacherstrasse 83', 4053, N'Basel', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762875, 1252415, N'MX756A13873', N'AMA@13873', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13875, N'Amavita', 10299, N'Amavita Apotheke Jegenstorf', N'Bernstrasse 2', 3303, N'Jegenstorf', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762877, 1252417, N'MX756A13875', N'AMA@13875', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (13984, N'Sun Store', 12056, N'Pharmacie Sun Store Vevey', N'Av. Général Guisan 17', 1800, N'Vevey', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763492, 1253730, N'MX756A13984', N'SUN@13984', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14136, N'Sun Store', 12058, N'Pharmacie Sun Store Gland', N'Rue Mauvernay-Rue des Alpes 2', 1196, N'Gland', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763493, 1253731, N'MX756A14136', N'SUN@14136', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14138, N'Amavita', 10090, N'Amavita Apotheke Zermatt ', N'Bahnhofstrasse 17', 3920, N'Zermatt', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 738360, 1211762, N'MX756A14138', N'AMA@14138', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14257, N'Sun Store', 12055, N'Pharmacie Sun Store Crissier', N'Ch. Closalet 7', 1023, N'Crissier', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763494, 1253732, N'MX756A14257', N'SUN@14257', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14264, N'Coop Vitality', 21265, N'CV Zürich Flughafen', N'Postfach Terminal 2', 8060, N'Zürich Flughafen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763608, 1253848, N'MX756A14264', N'COO@14264', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14313, N'Amavita', 10301, N'Amavita Apotheke St. Moritz-Bad', N'Via dal Bagn 1', 7500, N'St. Moritz', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762890, 1252430, N'MX756A14313', N'AMA@14313', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14315, N'Sun Store', 12005, N'Pharmacie Sun Store Sierre Manor', N'Rue de Plantassage 24', 3960, N'Sierre', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763495, 1253733, N'MX756A14315', N'SUN@14315', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14316, N'Sun Store', 12006, N'Pharmacie Sun Store Sierre Rossfeld', N'Route des Lacustres 2', 3960, N'Sierre', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763496, 1253734, N'MX756A14316', N'SUN@14316', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14317, N'Amavita', 10503, N'Farmacia Amavita Lugano', N'Via Francesco Soave 8', 6900, N'Lugano', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762844, 1252384, N'MX756A14317', N'AMA@14317', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14477, N'Sun Store', 12086, N'Pharmacie Sun Store Vernier', N'Rte de Peney 2-4', 1214, N'Vernier', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763497, 1253735, N'MX756A14477', N'SUN@14477', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14508, N'Amavita', 10239, N'Amavita Apotheke Chur', N'Bahnhof Passage / Bahnhofplatz 3', 7000, N'Chur', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762932, 1252472, N'MX756A14508', N'AMA@14508', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14513, N'Coop Vitality', 21243, N'CV Opfiken Glattpark', N'Boulevard Lilienthal 12', 8152, N'Glattpark (Opfikon)', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763609, 1253849, N'MX756A14513', N'COO@14513', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (14874, N'Sun Store', 12071, N'Pharmacie Sun Store Thônex', N'Rue de Genève 106', 1226, N'Thônex-Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763498, 1253736, N'MX756A14874', N'SUN@14874', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15136, N'Amavita', 10064, N'Pharmacie Amavita Acacias', N'Rte des Acacias 8', 1227, N'Les Acacias', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762799, 1252339, N'MX756A15136', N'AMA@15136', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15225, N'Amavita', 10001, N'Pharmacie Amavita Centrale Morges', N'Grand-Rue 69', 1110, N'Morges', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762703, 1252157, N'MX756A15225', N'AMA@15225', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15226, N'Amavita', 10002, N'Pharmacie Amavita Gottaz Centre', N'Centre commercial Gottaz / Avenue de la Gottaz 28', 1110, N'Morges', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762704, 1252158, N'MX756A15226', N'AMA@15226', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15227, N'Amavita', 10003, N'Pharmacie Amavita St-Laurent', N'Rue Haldimand 14', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762766, 1252306, N'MX756A15227', N'AMA@15227', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15228, N'Amavita', 10006, N'Pharmacie Amavita Croset', N'Centre Commercial / Du Croset 1', 1024, N'Ecublens', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762767, 1252307, N'MX756A15228', N'AMA@15228', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15229, N'Amavita', 10009, N'Pharmacie Amavita Petit-Lancy', N'Rte de Chancy 28', 1213, N'Petit-Lancy', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762768, 1252308, N'MX756A15229', N'AMA@15229', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15230, N'Amavita', 10010, N'Pharmacie Amavita Nutribio La Palud', N'Place de la Palud 23', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762769, 1252309, N'MX756A15230', N'AMA@15230', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15231, N'Amavita', 10011, N'Pharmacie Amavita La Broye', N'Grand-Rue 26', 1530, N'Payerne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762770, 1252310, N'MX756A15231', N'AMA@15231', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15232, N'Amavita', 10012, N'Pharmacie Amavita Domdidier', N'Imm. Capha / Rue Centrale 21', 1564, N'Domdidier', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762771, 1252311, N'MX756A15232', N'AMA@15232', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15233, N'Amavita', 10013, N'Pharmacie Amavita Carl-Vogt', N'Bd. Carl-Vogt 16', 1205, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762772, 1252312, N'MX756A15233', N'AMA@15233', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15234, N'Amavita', 10014, N'Pharmacie Amavita Cité-Jonction', N'Bd. Carl-Vogt 35', 1205, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762773, 1252313, N'MX756A15234', N'AMA@15234', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15235, N'Amavita', 10015, N'Pharmacie Amavita Portes-Rouges', N'Avenue des Portes-Rouges 46', 2000, N'Neuchâtel', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762774, 1252314, N'MX756A15235', N'AMA@15235', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15236, N'Amavita', 10021, N'Pharmacie Amavita Tramelan', N'Grand-Rue 153', 2720, N'Tramelan', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762775, 1252315, N'MX756A15236', N'AMA@15236', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15237, N'Amavita', 10023, N'Pharmacie Amavita Zimmermann', N'Rue de Lausanne 2', 1950, N'Sion', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762776, 1252316, N'MX756A15237', N'AMA@15237', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15238, N'Amavita', 10024, N'Amavita Apotheke Hofmann', N'Rte de Sion 14', 3960, N'Sierre', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762777, 1252317, N'MX756A15238', N'AMA@15238', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15239, N'Amavita', 10025, N'Pharmacie Amavita Pré-Guillaume', N'Rue de l''Avenir 3', 2800, N'Delémont', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762778, 1252318, N'MX756A15239', N'AMA@15239', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15240, N'Amavita', 10026, N'Pharmacie Amavita Gare Renens', N'Place de la Gare 4', 1020, N'Renens', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762779, 1252319, N'MX756A15240', N'AMA@15240', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15241, N'Amavita', 10027, N'Pharmacie Amavita Poste Le Locle', N'Rue Bournot 17b', 2400, N'Le Locle', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762780, 1252320, N'MX756A15241', N'AMA@15241', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15242, N'Amavita', 10029, N'Pharmacie Amavita Théâtre', N'Av. Georgette 4', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762781, 1252321, N'MX756A15242', N'AMA@15242', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15243, N'Amavita', 10031, N'Pharmacie Amavita Burgener', N'Av. Général-Guisan 12', 3960, N'Sierre', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762782, 1252322, N'MX756A15243', N'AMA@15243', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15244, N'Amavita', 10032, N'Pharmacie Amavita Coop Moutier', N'Centre Coop / Rue Industrielle 16', 2740, N'Moutier', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762783, 1252323, N'MX756A15244', N'AMA@15244', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15245, N'Amavita', 10033, N'Pharmacie Amavita Migros Moutier', N'Rue de l''Ecluse 1', 2740, N'Moutier', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762784, 1252324, N'MX756A15245', N'AMA@15245', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15246, N'Amavita', 10034, N'Pharmacie Amavita Porrentruy', N'Rue des Malvoisins 1', 2900, N'Porrentruy', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762785, 1252325, N'MX756A15246', N'AMA@15246', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15247, N'Amavita', 10035, N'Pharmacie Amavita Gare Nyon', N'Place de la Gare 7', 1260, N'Nyon', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762786, 1252326, N'MX756A15247', N'AMA@15247', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15248, N'Amavita', 10036, N'Pharmacie Amavita Beauregard', N'Chemin de Bethléem 3', 1700, N'Fribourg', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762787, 1252327, N'MX756A15248', N'AMA@15248', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15249, N'Amavita', 10038, N'Pharmacie Amavita du Collège', N'Rue du Lac 42', 1400, N'Yverdon-les-Bains', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762789, 1252329, N'MX756A15249', N'AMA@15249', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15250, N'Amavita', 10039, N'Pharmacie Amavita Portes St-François', N'Place St-François 1', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762790, 1252330, N'MX756A15250', N'AMA@15250', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15251, N'Amavita', 10045, N'Pharmacie Amavita du Grand-Pré', N'Impasse du Nouveau Marché 1', 1723, N'Marly', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762792, 1252332, N'MX756A15251', N'AMA@15251', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15252, N'Amavita', 10073, N'Pharmacie Amavita Chêne-Bourg', N'Rue de Genève 16', 1225, N'Chêne-Bourg', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762793, 1252333, N'MX756A15252', N'AMA@15252', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15253, N'Amavita', 10048, N'Pharmacie Amavita Plainpalais', N'Rue de Carouge 13', 1205, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762794, 1252334, N'MX756A15253', N'AMA@15253', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15254, N'Amavita', 10051, N'Pharmacie Amavita Mont-d''Or', N'Avenue de Cour 110', 1007, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762795, 1252335, N'MX756A15254', N'AMA@15254', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15255, N'Amavita', 10053, N'Pharmacie Amavita Pulliérane', N'Rue de la Poste 26', 1009, N'Pully', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762796, 1252336, N'MX756A15255', N'AMA@15255', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15256, N'Amavita', 10054, N'Pharmacie Amavita Copet', N'Avenue de Corsier 1', 1800, N'Vevey', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762797, 1252337, N'MX756A15256', N'AMA@15256', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15257, N'Amavita', 10055, N'Pharmacie Amavita Tronchet', N'Av. Tronchet 2', 1226, N'Thônex', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762798, 1252338, N'MX756A15257', N'AMA@15257', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15258, N'Amavita', 10069, N'Pharmacie Amavita Jura', N'Rue de la Prulay 2bis', 1217, N'Meyrin', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762800, 1252340, N'MX756A15258', N'AMA@15258', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15259, N'Amavita', 10200, N'Amavita Apotheke Murten', N'Hauptgasse 7', 3280, N'Murten', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762801, 1252341, N'MX756A15259', N'AMA@15259', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15260, N'Amavita', 10202, N'Amavita Apotheke Chly Wabern', N'Seftigenstrasse 368', 3084, N'Wabern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762802, 1252342, N'MX756A15260', N'AMA@15260', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15261, N'Amavita', 10205, N'Amavita Apotheke Glattzentrum', N'Einkaufszentrum Glatt / Neue Winterthurerstrasse 99', 8304, N'Wallisellen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762803, 1252343, N'MX756A15261', N'AMA@15261', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15262, N'Amavita', 10215, N'Amavita Apotheke Vorstadt', N'Vorstadt 30/32', 8200, N'Schaffhausen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762804, 1252344, N'MX756A15262', N'AMA@15262', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15263, N'Amavita', 10216, N'Amavita Apotheke Stadthaus', N'Stadthausgasse 10', 4051, N'Basel', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762805, 1252345, N'MX756A15263', N'AMA@15263', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15264, N'Amavita', 10217, N'Amavita Apotheke Gallusmarkt', N'Gallusmarkt / Favrestrasse 6', 9016, N'St. Gallen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762806, 1252346, N'MX756A15264', N'AMA@15264', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15265, N'Amavita', 10218, N'Amavita Apotheke Affoltern a. A.', N'Obere Bahnhofstrasse 12', 8910, N'Affoltern am Albis', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762807, 1252347, N'MX756A15265', N'AMA@15265', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15266, N'Amavita', 10219, N'Amavita Apotheke Rauracher', N'Rauracherstrasse 33/35', 4125, N'Riehen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762808, 1252348, N'MX756A15266', N'AMA@15266', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15267, N'Amavita', 10220, N'Amavita Apotheke Riehen', N'Webergässchen 6', 4125, N'Riehen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762809, 1252349, N'MX756A15267', N'AMA@15267', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15268, N'Amavita', 10221, N'Amavita Apotheke Zumikon', N'Dorfplatz 4', 8126, N'Zumikon', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762810, 1252350, N'MX756A15268', N'AMA@15268', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15269, N'Amavita', 10224, N'Amavita Apotheke Uzwil', N'Lindenstrasse 5', 9240, N'Uzwil', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762811, 1252351, N'MX756A15269', N'AMA@15269', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15270, N'Amavita', 10225, N'Amavita Apotheke Rümlang', N'Oberdorfstrasse 24', 8153, N'Rümlang', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762812, 1252352, N'MX756A15270', N'AMA@15270', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15271, N'Amavita', 10226, N'Amavita Apotheke Unterägeri', N'Zugerstrasse 32', 6314, N'Unterägeri', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762813, 1252353, N'MX756A15271', N'AMA@15271', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15272, N'Amavita', 10227, N'Amavita Apotheke Regensdorf', N'Zentrum 1', 8105, N'Regensdorf', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762814, 1252354, N'MX756A15272', N'AMA@15272', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15273, N'Amavita', 10228, N'Amavita Apotheke Kerzers', N'Murtenstrasse 13', 3210, N'Kerzers', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762815, 1252355, N'MX756A15273', N'AMA@15273', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15274, N'Amavita', 10229, N'Amavita Apotheke Oberengstringen', N'Zentrum 1', 8102, N'Oberengstringen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762816, 1252356, N'MX756A15274', N'AMA@15274', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15275, N'Amavita', 10231, N'Amavita Apotheke Neumarkt Oerlikon', N'Hofwiesenstrasse 350', 8050, N'Zürich', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762817, 1252357, N'MX756A15275', N'AMA@15275', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15276, N'Amavita', 10232, N'Amavita Apotheke Sunnemärt', N'Albisstrasse 10', 8134, N'Adliswil', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762818, 1252358, N'MX756A15276', N'AMA@15276', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15277, N'Amavita', 10234, N'Amavita Apotheke Tafers', N'Amtshausweg 1', 1712, N'Tafers', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762819, 1252359, N'MX756A15277', N'AMA@15277', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15278, N'Amavita', 10235, N'Amavita Apotheke Grosse Apotheke', N'Bahnhofstrasse 61', 3400, N'Burgdorf', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762820, 1252360, N'MX756A15278', N'AMA@15278', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15279, N'Amavita', 10236, N'Amavita Apotheke Central Basel', N'Centralbahnplatz 13', 4051, N'Basel', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762821, 1252361, N'MX756A15279', N'AMA@15279', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15280, N'Amavita', 10243, N'Amavita Apotheke Köniz', N'Bläuacker 10', 3098, N'Köniz', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762822, 1252362, N'MX756A15280', N'AMA@15280', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15281, N'Amavita', 10245, N'Amavita Apotheke Schwamendingen', N'Winterthurerstrasse 529', 8051, N'Zürich', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762823, 1252363, N'MX756A15281', N'AMA@15281', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15282, N'Amavita', 10249, N'Amavita Apotheke Bahnhof Bern', N'Christoffelunterführung 6 / Rail City', 3011, N'Bern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762824, 1252364, N'MX756A15282', N'AMA@15282', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15283, N'Amavita', 10250, N'Amavita Apotheke Langenthal', N'Wiesenstrasse 28', 4900, N'Langenthal', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762825, 1252365, N'MX756A15283', N'AMA@15283', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15284, N'Amavita', 10254, N'Amavita Apotheke Zug', N'Bundesplatz 10', 6300, N'Zug', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762826, 1252366, N'MX756A15284', N'AMA@15284', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15286, N'Amavita', 10257, N'Amavita Apotheke Dietikon', N'Badenerstrasse 15', 8953, N'Dietikon', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762828, 1252368, N'MX756A15286', N'AMA@15286', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15287, N'Amavita', 10260, N'Amavita Apotheke & Drogerie Altdorf', N'Schmiedgasse 11', 6460, N'Altdorf UR', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762830, 1252370, N'MX756A15287', N'AMA@15287', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15288, N'Amavita', 10261, N'Amavita Apotheke Biberist', N'Hauptstrasse 30', 4562, N'Biberist', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762831, 1252371, N'MX756A15288', N'AMA@15288', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15289, N'Amavita', 10263, N'Amavita Apotheke Tivoli', N'Shoppi Tivoli', 8957, N'Spreitenbach', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762832, 1252372, N'MX756A15289', N'AMA@15289', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15291, N'Amavita', 10266, N'Amavita Apotheke & Drogerie Schneeberger', N'Bachweg 1', 4144, N'Arlesheim', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762834, 1252374, N'MX756A15291', N'AMA@15291', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15292, N'Amavita', 10271, N'Amavita Apotheke Würzenbach', N'Migros Würzenbach / Kreuzbuchstrasse 53', 6006, N'Luzern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762837, 1252377, N'MX756A15292', N'AMA@15292', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15293, N'Amavita', 10272, N'Amavita Apotheke Schönbühl', N'Shoppingcenter Schönbühl / Langensandstrasse 23', 6005, N'Luzern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762838, 1252378, N'MX756A15293', N'AMA@15293', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15294, N'Amavita', 10276, N'Amavita Apotheke Säntispark', N'EKZ Säntispark / Wiesenbachstrasse 7', 9030, N'Abtwil', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762841, 1252381, N'MX756A15294', N'AMA@15294', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15295, N'Amavita', 10277, N'Amavita Apotheke Derendingen', N'Hauptstrasse 28', 4552, N'Derendingen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762842, 1252382, N'MX756A15295', N'AMA@15295', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15296, N'Amavita', 10500, N'Farmacia Amavita Realini', N'Centro Cattori-Coop / Via Emmaus 1', 6616, N'Losone', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762843, 1252383, N'MX756A15296', N'AMA@15296', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15297, N'Amavita', 10504, N'Farmacia Amavita Lurà', N'Via Luigi Lavizzari 19', 6850, N'Mendrisio', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762845, 1252385, N'MX756A15297', N'AMA@15297', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15298, N'Amavita', 10207, N'Amavita Apotheke St. Jakob', N'St. Jakob-Strasse 38', 9000, N'St. Gallen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762846, 1252386, N'MX756A15298', N'AMA@15298', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15300, N'Amavita', 10241, N'Amavita Apotheke Zentral', N'Kirchenfeldstrasse 2', 5630, N'Muri AG', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762848, 1252388, N'MX756A15300', N'AMA@15300', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15301, N'Amavita', 10280, N'Amavita Apotheke Outlet Rothrist', N'Breitenpark / Neue Aarburgerstrasse 20', 4852, N'Rothrist', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762849, 1252389, N'MX756A15301', N'AMA@15301', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15302, N'Amavita', 10095, N'Pharmacie Amavita Place Claparède', N'Rue Emile-Yung 1', 1205, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762850, 1252390, N'MX756A15302', N'AMA@15302', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15308, N'Amavita', 10282, N'Amavita Apotheke Sirnach', N'Wilerstrasse 6', 8370, N'Sirnach', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762856, 1252396, N'MX756A15308', N'AMA@15308', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15309, N'Amavita', 10076, N'Pharmacie Amavita Ancien Stand', N'Route des Plaines-du-Loup 10', 1018, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762857, 1252397, N'MX756A15309', N'AMA@15309', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15311, N'Amavita', 10092, N'Pharmacie Amavita St. Imier', N'Rue Francillon 15', 2610, N'St-Imier', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762859, 1252399, N'MX756A15311', N'AMA@15311', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15312, N'Amavita', 10079, N'Pharmacie Amavita Granges-Paccot', N'Route d’Agy 2', 1763, N'Granges-Paccot', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762860, 1252400, N'MX756A15312', N'AMA@15312', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15314, N'Amavita', 10285, N'Amavita Apotheke Frohsinn', N'Zürcherstrasse 25', 8730, N'Uznach', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762862, 1252402, N'MX756A15314', N'AMA@15314', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15315, N'Amavita', 10287, N'Amavita Kreuz Apotheke', N'Bernstrasse 150', 3052, N'Zollikofen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762863, 1252403, N'MX756A15315', N'AMA@15315', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15316, N'Amavita', 10506, N'Farmacia Amavita Mordasini', N'Centro Migros / Via Serrai 5', 6592, N'S. Antonino', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762865, 1252405, N'MX756A15316', N'AMA@15316', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15318, N'Amavita', 10507, N'Farmacia Amavita Gianella', N'Via Pretorio 15', 6900, N'Lugano', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762867, 1252407, N'MX756A15318', N'AMA@15318', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15319, N'Amavita', 10081, N'Pharmacie Amavita Raboud', N'Rue du Midi 2', 1870, N'Monthey', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762868, 1252408, N'MX756A15319', N'AMA@15319', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15320, N'Amavita', 10082, N'Pharmacie Amavita Cortot', N'Avenue Alfred Cortot 7a', 1260, N'Nyon', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762869, 1252409, N'MX756A15320', N'AMA@15320', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15321, N'Amavita', 10083, N'Pharmacie Amavita Cheseaux', N'Route de Lausanne 5', 1033, N'Cheseaux-Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762870, 1252410, N'MX756A15321', N'AMA@15321', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15322, N'Amavita', 10290, N'Amavita Apotheke Ilanz', N'Bahnhofstrasse 10', 7130, N'Ilanz', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762871, 1252411, N'MX756A15322', N'AMA@15322', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15323, N'Amavita', 10292, N'Amavita Apotheke Volz', N'Zytgloggelaube 2', 3011, N'Bern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762872, 1252412, N'MX756A15323', N'AMA@15323', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15324, N'Amavita', 10084, N'Pharmacie Amavita Savigny', N'Place du Forum 1', 1073, N'Savigny', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762878, 1252418, N'MX756A15324', N'AMA@15324', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15325, N'Amavita', 10022, N'Pharmacie Amavita Château-d''Oex', N'Grand-Rue 67', 1660, N'Château-d''Oex', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762879, 1252419, N'MX756A15325', N'AMA@15325', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15326, N'Amavita', 10256, N'Amavita Apotheke im Zollikerberg', N'Forchstrasse 146', 8125, N'Zollikerberg', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762880, 1252420, N'MX756A15326', N'AMA@15326', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15327, N'Amavita', 10251, N'Amavita Apotheke Seen', N'Shopping Seen / Hinterdorfstrasse 40', 8405, N'Winterthur', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762881, 1252421, N'MX756A15327', N'AMA@15327', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15329, N'Amavita', 10214, N'Amavita Apotheke Münchenbuchsee', N'Oberdorfstrasse 5', 3053, N'Münchenbuchsee', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762883, 1252423, N'MX756A15329', N'AMA@15329', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15330, N'Amavita', 10201, N'Amavita Apotheke Poststrasse', N'Poststrasse 9', 9001, N'St. Gallen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762884, 1252424, N'MX756A15330', N'AMA@15330', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15331, N'Amavita', 10208, N'Amavita Apotheke Derby', N'Obere Bahnhofstrasse 1', 9501, N'Wil SG 1', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762885, 1252425, N'MX756A15331', N'AMA@15331', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15334, N'Amavita', 10302, N'Amavita Apotheke Mellingen', N'Im Geerig / Lenzburgstrasse 50', 5507, N'Mellingen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762888, 1252428, N'MX756A15334', N'AMA@15334', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15335, N'Amavita', 10087, N'Pharmacie Amavita Delémont', N'Avenue de la Gare 46', 2800, N'Delémont', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762889, 1252429, N'MX756A15335', N'AMA@15335', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15336, N'Amavita', 10300, N'Amavita Apotheke Breitenrain', N'Moserstrasse 33', 3014, N'Bern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762891, 1252431, N'MX756A15336', N'AMA@15336', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15337, N'Amavita', 10043, N'Pharmacie Amavita St-Barthélemy', N'Route de Tavel 2', 1707, N'Fribourg', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762892, 1252432, N'MX756A15337', N'AMA@15337', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15338, N'Amavita', 10019, N'Pharmacie Amavita La Harpe', N'Av. de Cour 11', 1007, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762893, 1252433, N'MX756A15338', N'AMA@15338', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15339, N'Amavita', 10020, N'Pharmacie Amavita Condémine', N'Rue de la Condémine 56', 1630, N'Bulle', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762894, 1252434, N'MX756A15339', N'AMA@15339', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15340, N'Amavita', 10247, N'Amavita Apotheke Ebikon', N'Zentralstrasse 30', 6030, N'Ebikon', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762895, 1252435, N'MX756A15340', N'AMA@15340', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15341, N'Amavita', 10016, N'Pharmacie Amavita Seyon', N'Rue du Seyon 14', 2000, N'Neuchâtel', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762896, 1252436, N'MX756A15341', N'AMA@15341', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15342, N'Amavita', 10085, N'Pharmacie Amavita Neyruz', N'Place de la Gare 8', 1740, N'Neyruz FR', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762897, 1252437, N'MX756A15342', N'AMA@15342', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15343, N'Amavita', 10007, N'Pharmacie Amavita Collonge-Bellerive', N'Chemin du Pré d''Orsat 8', 1245, N'Collonge-Bellerive', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762898, 1252438, N'MX756A15343', N'AMA@15343', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15344, N'Amavita', 10091, N'Pharmacie Amavita Alpha-Payerne', N'Grand-Rue 33', 1530, N'Payerne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762899, 1252439, N'MX756A15344', N'AMA@15344', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15345, N'Amavita', 10284, N'Amavita Apotheke Dr. Steiner', N'Bahnhofstrasse 9', 2502, N'Biel/Bienne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762900, 1252440, N'MX756A15345', N'AMA@15345', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15346, N'Amavita', 10278, N'Amavita Apotheke Rigimärt', N'Im Rigimärt / Siegwartstrasse 11', 6403, N'Küssnacht am Rigi', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762901, 1252441, N'MX756A15346', N'AMA@15346', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15347, N'Amavita', 10089, N'Pharmacie Amavita Verbier', N'Immeuble " Les Arcades " / Route de Verbier-Station 28', 1936, N'Verbier', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762902, 1252442, N'MX756A15347', N'AMA@15347', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15348, N'Amavita', 10070, N'Pharmacie Amavita Champs-Fréchets', N'Promenade des Artisans 34', 1217, N'Meyrin', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762903, 1252443, N'MX756A15348', N'AMA@15348', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15349, N'Amavita', 10008, N'Pharmacie Amavita Perraudettaz', N'Av. de Lavaux 6', 1009, N'Pully', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762904, 1252444, N'MX756A15349', N'AMA@15349', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15350, N'Amavita', 10004, N'Pharmacie Amavita Conod', N'Rue Pichard 16', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762905, 1252445, N'MX756A15350', N'AMA@15350', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15351, N'Amavita', 10246, N'Amavita Apotheke Landi', N'Grabenstrasse 15', 7001, N'Chur', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762907, 1252447, N'MX756A15351', N'AMA@15351', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15352, N'Amavita', 10289, N'Amavita Apotheke Wengihof', N'Kernstrasse 8', 8004, N'Zürich', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762909, 1252449, N'MX756A15352', N'AMA@15352', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15353, N'Amavita', 10253, N'Amavita Apotheke & Drogerie Brugg', N'Neumarktplatz 16', 5200, N'Brugg', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762910, 1252450, N'MX756A15353', N'AMA@15353', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15354, N'Amavita', 10304, N'Amavita Apotheke Liestal', N'Rathausstrasse 53', 4410, N'Liestal', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762913, 1252453, N'MX756A15354', N'AMA@15354', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15355, N'Amavita', 10078, N'Pharmacie Amavita des 2 Thielles', N'Centre Migros le Landeron / Rte de Neuchâtel 46', 2525, N'Le Landeron', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762914, 1252454, N'MX756A15355', N'AMA@15355', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15356, N'Amavita', 10233, N'Amavita Apotheke Wynecenter', N'Wynecenter / Bresteneggstrasse 9b', 5033, N'Buchs', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762915, 1252455, N'MX756A15356', N'AMA@15356', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15357, N'Amavita', 10077, N'Pharmacie Amavita Le Landeron', N'Rue de Soleure 33C', 2525, N'Le Landeron', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762916, 1252456, N'MX756A15357', N'AMA@15357', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15358, N'Amavita', 10071, N'Pharmacie Amavita Tripet', N'Rue du Seyon 8', 2000, N'Neuchâtel', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762917, 1252457, N'MX756A15358', N'AMA@15358', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15359, N'Amavita', 10005, N'Pharmacie Amavita Les Arcades', N'Rue du Midi 10', 1020, N'Renens', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762918, 1252458, N'MX756A15359', N'AMA@15359', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15360, N'Amavita', 10305, N'Amavita Apotheke Bücheli Center', N'Büchelistrasse 10', 4410, N'Liestal', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762919, 1252459, N'MX756A15360', N'AMA@15360', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15361, N'Amavita', 10086, N'Pharmacie Amavita du Lignon', N'Place du Lignon 19', 1219, N'Le Lignon', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762922, 1252462, N'MX756A15361', N'AMA@15361', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15362, N'Amavita', 10307, N'Amavita Apotheke Hirschengraben', N'Hirschengraben 9', 3011, N'Bern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762923, 1252463, N'MX756A15362', N'AMA@15362', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15363, N'Amavita', 10059, N'Amavita Apotheke Vispach', N'Centerpark', 3930, N'Visp', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762924, 1252464, N'MX756A15363', N'AMA@15363', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15364, N'Amavita', 10211, N'Amavita Apotheke Rhyland', N'Einkaufszentrum Rhyland / Bahnhofstrasse 7', 9443, N'Widnau', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762925, 1252465, N'MX756A15364', N'AMA@15364', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15365, N'Amavita', 10096, N'Pharmacie Amavita Chavornay', N'Rue de la Gare 1', 1373, N'Chavornay', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762926, 1252466, N'MX756A15365', N'AMA@15365', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15366, N'Amavita', 10502, N'Farmacia Amavita Centro Breggia', N'Centro Breggia / Via S. Gottardo 56a', 6828, N'Balerna', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762927, 1252467, N'MX756A15366', N'AMA@15366', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15367, N'Amavita', 10248, N'Amavita Apotheke Horw', N'Gemeindehausplatz 17', 6048, N'Horw', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762928, 1252468, N'MX756A15367', N'AMA@15367', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15368, N'Amavita', 10072, N'Pharmacie Amavita Croisettes', N'Chemin des Croisettes 9B', 1066, N'Epalinges', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762929, 1252469, N'MX756A15368', N'AMA@15368', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15369, N'Amavita', 10505, N'Farmacia Amavita Centro Ascona', N'Via Borgo 28', 6612, N'Ascona', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762930, 1252470, N'MX756A15369', N'AMA@15369', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15370, N'Amavita', 10238, N'Amavita Apotheke Paradies', N'Einkaufsparadies / Spitzwaldstrasse 215', 4123, N'Allschwil', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762931, 1252471, N'MX756A15370', N'AMA@15370', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15371, N'Amavita', 10311, N'Amavita Apotheke Oberland', N'Bühnimatta 3', 1716, N'Plaffeien', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762933, 1252473, N'MX756A15371', N'AMA@15371', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15372, N'Amavita', 10052, N'Pharmacie Amavita du Trèfle', N'La Couronne 3', 2024, N'St-Aubin-Sauges', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762935, 1252475, N'MX756A15372', N'AMA@15372', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15373, N'Amavita', 10042, N'Pharmacie Amavita Cardinaux', N'Rue des Eaux-Vives 1', 1207, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762936, 1252476, N'MX756A15373', N'AMA@15373', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15374, N'Amavita', 10049, N'Pharmacie Amavita Croix-Blanche', N'Place de la Croix-Blanche 5', 1066, N'Epalinges', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762937, 1252477, N'MX756A15374', N'AMA@15374', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15375, N'Amavita', 10030, N'Pharmacie Amavita Courtepin', N'Le Centre 2', 1784, N'Courtepin', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762939, 1252479, N'MX756A15375', N'AMA@15375', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15376, N'Amavita', 10213, N'Amavita Apotheke Rheinbrücke', N'Greifengasse 17', 4058, N'Basel', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762940, 1252480, N'MX756A15376', N'AMA@15376', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15377, N'Amavita', 10312, N'Amavita Apotheke Basel St. Jakob', N'St. Jakobs-Strasse 397', 4052, N'Basel', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762941, 1252481, N'MX756A15377', N'AMA@15377', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15378, N'Amavita', 10315, N'Amavita Apotheke Oftringen', N'Zürichstrasse 2', 4665, N'Oftringen', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762942, 1252482, N'MX756A15378', N'AMA@15378', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15379, N'Amavita', 10093, N'Pharmacie Amavita Aigle', N'Place de la Gare 5', 1860, N'Aigle', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762943, 1252483, N'MX756A15379', N'AMA@15379', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15380, N'Amavita', 10017, N'Pharmacie Amavita Espacité', N'Espacité 5', 2300, N'La Chaux-de-Fonds', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762944, 1252484, N'MX756A15380', N'AMA@15380', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15381, N'Amavita', 10097, N'Pharmacie Amavita Charmilles', N'Promenade de l''Europe 11', 1203, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762946, 1252486, N'MX756A15381', N'AMA@15381', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15382, N'Amavita', 10264, N'Amavita Apotheke Ischi', N'Spitalgasse 37', 3011, N'Bern', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762947, 1252487, N'MX756A15382', N'AMA@15382', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15383, N'Amavita', 10308, N'Amavita Apotheke Deutweg', N'Pflanzschulstrasse 9', 8400, N'Winterthur', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762949, 1252489, N'MX756A15383', N'AMA@15383', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15384, N'Amavita', 10222, N'Amavita Apotheke Albisstrasse', N'Albisstrasse 106', 8038, N'Zürich', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762950, 1252490, N'MX756A15384', N'AMA@15384', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15385, N'Amavita', 10230, N'Amavita Apotheke Stern', N'Collègegasse 17', 2502, N'Biel/Bienne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 762951, 1252491, N'MX756A15385', N'AMA@15385', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15391, N'Sun Store', 12002, N'Pharmacie Sun Store Sion Métropole', N'Avenue de France 14-20', 1950, N'Sion', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763499, 1253737, N'MX756A15391', N'SUN@15391', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15392, N'Sun Store', 12003, N'Pharmacie Sun Store Sion Gare CFF', N'Place de la Gare 1', 1950, N'Sion', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763500, 1253738, N'MX756A15392', N'SUN@15392', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15393, N'Sun Store', 12004, N'Pharmacie Sun Store Monthey Manor', N'Avenue de l''Europe 21', 1870, N'Monthey', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763501, 1253739, N'MX756A15393', N'SUN@15393', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15394, N'Sun Store', 12008, N'Pharmacie Sun Store Martigny Manoir', N'Rue du Manoir 1', 1920, N'Martigny', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763502, 1253740, N'MX756A15394', N'SUN@15394', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15395, N'Sun Store', 12009, N'Pharmacie Sun Store Martigny Cristal', N'Av. de Fully 53', 1920, N'Martigny 1', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763503, 1253741, N'MX756A15395', N'SUN@15395', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15396, N'Sun Store', 12010, N'Pharmacie Sun Store Collombey', N'Centre commercial Parc du Rhône / Z.A. Pré Jacquet 1', 1868, N'Collombey', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763504, 1253742, N'MX756A15396', N'SUN@15396', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15397, N'Sun Store', 12012, N'Pharmacie Sun Store Sion Midi', N'Place du Midi 40', 1950, N'Sion', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763505, 1253743, N'MX756A15397', N'SUN@15397', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15398, N'Sun Store', 12013, N'Pharmacie Sun Store Conthey Forum', N'Route des Rottes 15', 1964, N'Conthey', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763506, 1253744, N'MX756A15398', N'SUN@15398', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15399, N'Sun Store', 12015, N'Pharmacie Sun Store Conthey Bassin', N'Route Cantonale 6', 1964, N'Conthey', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763507, 1253745, N'MX756A15399', N'SUN@15399', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15400, N'Sun Store', 12016, N'Pharmacie Sun Store Ardon', N'Route du Simplon 46', 1957, N'Ardon', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763508, 1253746, N'MX756A15400', N'SUN@15400', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15401, N'Sun Store', 12018, N'Pharmacie Sun Store Fribourg', N'Rue de Romont 26', 1700, N'Fribourg', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763509, 1253747, N'MX756A15401', N'SUN@15401', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15402, N'Sun Store', 12019, N'Pharmacie Sun Store Avry', N'Route de Matran 9', 1754, N'Avry-sur-Matran', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763510, 1253748, N'MX756A15402', N'SUN@15402', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15403, N'Sun Store', 12022, N'Pharmacie Sun Store Marin Manor', N'Av. des Champs-Montants 2', 2074, N'Marin-Centre', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763511, 1253749, N'MX756A15403', N'SUN@15403', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15404, N'Sun Store', 12023, N'Pharmacie Sun Store Marin Centre', N'Rue Fleur-de-Lys 26', 2074, N'Marin-Centre', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763512, 1253750, N'MX756A15404', N'SUN@15404', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15405, N'Sun Store', 12024, N'Pharmacie Sun Store Lausanne Métropole', N'Rue des Terreaux 25', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763513, 1253751, N'MX756A15405', N'SUN@15405', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15406, N'Sun Store', 12025, N'Pharmacie Sun Store Chaux-de-Fonds Métropole', N'Rue Daniel-Jeanrichard 23', 2300, N'La Chaux-de-Fonds', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763514, 1253752, N'MX756A15406', N'SUN@15406', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15407, N'Sun Store', 12098, N'Pharmacie Sun Store Chaux-de-Fonds Eplatures', N'Boulevard des Eplatures 20', 2300, N'La Chaux-de-Fonds', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763515, 1253753, N'MX756A15407', N'SUN@15407', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15408, N'Sun Store', 12028, N'Pharmacie Sun Store Delémont', N'Rue de la Maltière 12', 2800, N'Delémont', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763516, 1253754, N'MX756A15408', N'SUN@15408', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15409, N'Sun Store', 12029, N'Pharmacie Sun Store Bassecourt', N'Rue de l''Abbé-Monnin 81', 2854, N'Bassecourt', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763517, 1253755, N'MX756A15409', N'SUN@15409', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15410, N'Sun Store', 12030, N'Pharmacie Sun Store Rolle', N'Avenue de la Gare 17', 1180, N'Rolle', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763518, 1253756, N'MX756A15410', N'SUN@15410', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15411, N'Sun Store', 12032, N'Pharmacie Sun Store Nyon Combe', N'Rue de la Morâche 6', 1260, N'Nyon', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763519, 1253757, N'MX756A15411', N'SUN@15411', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15412, N'Sun Store', 12033, N'Pharmacie Sun Store Villeneuve', N'Centre commercial Riviera / Route de Pré-de-la-Croix 18', 1847, N'Rennaz', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763520, 1253758, N'MX756A15412', N'SUN@15412', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15413, N'Sun Store', 12034, N'Pharmacie Sun Store Clarens', N'Avenue des Pléiades 6', 1815, N'Clarens', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763521, 1253759, N'MX756A15413', N'SUN@15413', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15414, N'Sun Store', 12035, N'Pharmacie Sun Store Lausanne Bergières', N'Avenue des Bergières 50', 1004, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763522, 1253760, N'MX756A15414', N'SUN@15414', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15415, N'Sun Store', 12036, N'Pharmacie Sun Store Nyon Bourg', N'Route de la Gare 11 / Place Bel-Air', 1260, N'Nyon', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763523, 1253761, N'MX756A15415', N'SUN@15415', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15416, N'Sun Store', 12037, N'Pharmacie Sun Store Lausanne Gare CFF', N'Place de la Gare 9', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763524, 1253762, N'MX756A15416', N'SUN@15416', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15417, N'Sun Store', 12038, N'Pharmacie Sun Store Echallens', N'Rue de Praz-Palud 2', 1040, N'Echallens', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763525, 1253763, N'MX756A15417', N'SUN@15417', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15418, N'Sun Store', 12039, N'Pharmacie Sun Store Orbe', N'Rte de Valeyres 1', 1350, N'Orbe', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763526, 1253764, N'MX756A15418', N'SUN@15418', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15419, N'Sun Store', 12040, N'Pharmacie Sun Store Chêne-Bourg', N'Avenue de Bel-Air 12', 1225, N'Chêne-Bourg', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763527, 1253765, N'MX756A15419', N'SUN@15419', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15420, N'Sun Store', 12042, N'Pharmacie Sun Store Petit-Lancy', N'Route de Chancy 71', 1213, N'Petit-Lancy', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763528, 1253766, N'MX756A15420', N'SUN@15420', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15421, N'Sun Store', 12044, N'Pharmacie Sun Store Genève Les Cygnes', N'Rue de Lausanne 20', 1201, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763529, 1253767, N'MX756A15421', N'SUN@15421', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15422, N'Sun Store', 12045, N'Pharmacie Sun Store Cossonay', N'Route des Chavannes 1A', 1304, N'Cossonay-Ville', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763530, 1253768, N'MX756A15422', N'SUN@15422', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15423, N'Sun Store', 12046, N'Pharmacie Sun Store Avenches', N'Centre Coop Milavy', 1580, N'Avenches', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763531, 1253769, N'MX756A15423', N'SUN@15423', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15424, N'Sun Store', 12048, N'Pharmacie Sun Store Ecublens Croset', N'Centre commercial Coop / Chemin du Croset 1-3', 1024, N'Ecublens', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763532, 1253770, N'MX756A15424', N'SUN@15424', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15425, N'Sun Store', 12051, N'Pharmacie Sun Store Yverdon', N'Rue de Neuchâtel 3', 1400, N'Yverdon-les-Bains', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763533, 1253771, N'MX756A15425', N'SUN@15425', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15426, N'Sun Store', 12052, N'Pharmacie Sun Store Montagny', N'En Chamard 14', 1442, N'Montagny-Yverdon', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763534, 1253772, N'MX756A15426', N'SUN@15426', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15427, N'Sun Store', 12053, N'Pharmacie Sun Store Lausanne Chailly', N'Ch. de Rovéréaz 5', 1012, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763535, 1253773, N'MX756A15427', N'SUN@15427', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15428, N'Sun Store', 12067, N'Pharmacie Sun Store Bulle Coop', N'Route de Riaz 50', 1630, N'Bulle', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763536, 1253774, N'MX756A15428', N'SUN@15428', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15431, N'Sun Store', 12072, N'Pharmacie Sun Store Porrentruy', N'Esplanade Centre / faubourg St.-Germain 2', 2900, N'Porrentruy', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763538, 1253776, N'MX756A15431', N'SUN@15431', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15432, N'Sun Store', 12073, N'Pharmacie Sun Store Blonay', N'Route du Village 37', 1807, N'Blonay', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763539, 1253777, N'MX756A15432', N'SUN@15432', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15434, N'Sun Store', 12085, N'Pharmacie Sun Store Bussigny', N'Rue de la Gare 19', 1030, N'Bussigny-Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763541, 1253779, N'MX756A15434', N'SUN@15434', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15435, N'Sun Store', 12087, N'Pharmacie Sun Store Avanchets', N'Rue du Grand Bay 21', 1220, N'Les Avanchets', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763542, 1253780, N'MX756A15435', N'SUN@15435', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15436, N'Sun Store', 12089, N'Pharmacie Sun Store Signy Centre', N'Rue des Fléchères 7A', 1274, N'Signy', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763543, 1253781, N'MX756A15436', N'SUN@15436', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15452, N'Sun Store', 12502, N'Farmacia Sun Store Lugano Beltramina', N'Via Beltramina 1', 6900, N'Lugano', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763559, 1253797, N'MX756A15452', N'SUN@15452', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15453, N'Sun Store', 12503, N'Farmacia Sun Store Locarno', N'Via Luini 23', 6600, N'Locarno', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763560, 1253798, N'MX756A15453', N'SUN@15453', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15454, N'Sun Store', 12091, N'Pharmacie Sun Store Vevey 2 Gares', N'Rue des Deux-Gares 8', 1800, N'Vevey', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763561, 1253799, N'MX756A15454', N'SUN@15454', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15458, N'Sun Store', 12093, N'Pharmacie Sun Store Romont', N'Avenue de la Gare 7', 1680, N'Romont', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763564, 1253802, N'MX756A15458', N'SUN@15458', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15459, N'Sun Store', 12082, N'Pharmacie Sun Store Morges Centre', N'Rue Centrale 12', 1110, N'Morges', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763565, 1253803, N'MX756A15459', N'SUN@15459', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15461, N'Sun Store', 12070, N'Pharmacie Sun Store Genève Plainpalais', N'Rue de Carouge 64', 1205, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763567, 1253805, N'MX756A15461', N'SUN@15461', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15462, N'Sun Store', 12047, N'Pharmacie Sun Store Lausanne Riponne', N'Angle Riponne - Haldimand 1', 1003, N'Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763568, 1253806, N'MX756A15462', N'SUN@15462', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15463, N'Sun Store', 12090, N'Pharmacie Sun Store Versoix', N'Chemin Jean-Baptiste Vandelle 8A', 1290, N'Versoix', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763569, 1253807, N'MX756A15463', N'SUN@15463', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15464, N'Sun Store', 12074, N'Pharmacie Sun Store Genève Lyon', N'Rue de Lyon 81', 1203, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763570, 1253808, N'MX756A15464', N'SUN@15464', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15465, N'Sun Store', 12011, N'Pharmacie Sun Store Monthey MCentral', N'Avenue de la Gare 36', 1870, N'Monthey', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763571, 1253809, N'MX756A15465', N'SUN@15465', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15466, N'Sun Store', 12057, N'Pharmacie Sun Store Lutry', N'Route de l''Ancienne Ciblerie 2', 1095, N'Lutry', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763572, 1253810, N'MX756A15466', N'SUN@15466', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15467, N'Sun Store', 12062, N'Pharmacie Sun Store Romanel', N'En Félezin', 1032, N'Romanel-s-Lausanne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763573, 1253811, N'MX756A15467', N'SUN@15467', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15468, N'Sun Store', 12078, N'Pharmacie Sun Store Vésenaz', N'Rte de Thonon 55', 1222, N'Vésenaz', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763574, 1253812, N'MX756A15468', N'SUN@15468', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15469, N'Sun Store', 12031, N'Pharmacie Sun Store Renens', N'Avenue du 14 Avril 8', 1020, N'Renens', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763575, 1253813, N'MX756A15469', N'SUN@15469', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15470, N'Sun Store', 12043, N'Pharmacie Sun Store Carouge Praille', N'Avenue Vibert 32', 1227, N'Carouge', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763576, 1253814, N'MX756A15470', N'SUN@15470', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15471, N'Sun Store', 12020, N'Pharmacie Sun Store Villars-sur-Glâne', N'Route de Moncor 1', 1752, N'Villars-sur-Glâne', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763577, 1253815, N'MX756A15471', N'SUN@15471', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15472, N'Sun Store', 12097, N'Pharmacie Sun Store Neuchâtel', N'Rue de l''Hôpital 2', 2000, N'Neuchâtel', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763578, 1253816, N'MX756A15472', N'SUN@15472', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15473, N'Sun Store', 12083, N'Pharmacie Sun Store Etoy', N'Route Suisse 26', 1163, N'Etoy', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763579, 1253817, N'MX756A15473', N'SUN@15473', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15474, N'Sun Store', 12054, N'Pharmacie Sun Store Allaman', N'Route de la Gare 10', 1165, N'Allaman', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763580, 1253818, N'MX756A15474', N'SUN@15474', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15477, N'Sun Store', 12017, N'Pharmacie Sun Store Aigle', N'Chemin Sous le Grand-Pré 4', 1860, N'Aigel', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763583, 1253821, N'MX756A15477', N'SUN@15477', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15478, N'Sun Store', 12021, N'Pharmacie Sun Store Bulle Migros', N'Rue du Château d''En Bas 2', 1630, N'Bulle', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763584, 1253822, N'MX756A15478', N'SUN@15478', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15479, N'Sun Store', 12063, N'Pharmacie Sun Store Pully', N'Place Neuve 2', 1009, N'Pully', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763585, 1253823, N'MX756A15479', N'SUN@15479', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15481, N'Sun Store', 12064, N'Pharmacie Sun Store Moudon', N'Avenue de la grande fin 1', 1510, N'Moudon', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763586, 1253824, N'MX756A15481', N'SUN@15481', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15482, N'Sun Store', 12100, N'Pharmacie Sun Store Genève Pâquis', N'Rue des Pâquis 10', 1201, N'Genève', N'GaleniCare AG, Bern / CHE-103.239.360 MWST', 763587, 1253825, N'MX756A15482', N'SUN@15482', N'GaleniCare AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15488, N'Coop Vitality', 21003, N'CV Chaux-de-Fonds', N'Les Entilles Centre / Av. Léopold-Robert 151', 2300, N'La Chaux-de-Fonds', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763610, 1253850, N'MX756A15488', N'COO@15488', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15489, N'Coop Vitality', 21004, N'CV Maladière Neuchâtel', N'La Maladière Centre / Rue de la Pierre-à-Mazal 10R', 2000, N'Neuchâtel', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763611, 1253851, N'MX756A15489', N'COO@15489', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15490, N'Coop Vitality', 21005, N'CV Morges', N'Rue des Fossés 4', 1110, N'Morges', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763612, 1253852, N'MX756A15490', N'COO@15490', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15491, N'Coop Vitality', 21006, N'CV Sierre', N'Av. Max Huber 7', 3960, N'Sierre', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763613, 1253853, N'MX756A15491', N'COO@15491', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15492, N'Coop Vitality', 21009, N'CV Onex', N'Centre commercial Coop / Rue des Bossons 21', 1213, N'Onex', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763614, 1253854, N'MX756A15492', N'COO@15492', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15493, N'Coop Vitality', 21204, N'CV Biel Centre Bahnhof', N'Centre Bahnhof / Salzhausstrasse 31', 2503, N'Biel', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763615, 1253855, N'MX756A15493', N'COO@15493', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15495, N'Coop Vitality', 21209, N'CV Bachenbülach', N'Coop Center / Grabenstrasse 6', 8184, N'Bachenbülach', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763616, 1253856, N'MX756A15495', N'COO@15495', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15497, N'Coop Vitality', 21219, N'CV Basel Europe', N'Europecenter / Clarastrasse 41', 4058, N'Basel', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763618, 1253858, N'MX756A15497', N'COO@15497', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15498, N'Coop Vitality', 21221, N'CV Kreuzlingen Karussell', N'Einkaufszentrum Karussell / Sonnenstrasse 16', 8280, N'Kreuzlingen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763619, 1253859, N'MX756A15498', N'COO@15498', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15499, N'Coop Vitality', 21222, N'CV Rickenbach', N'Coop Zentrum Breite / Breitestrasse 4', 9532, N'Rickenbach b. Will', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763620, 1253860, N'MX756A15499', N'COO@15499', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15500, N'Coop Vitality', 21224, N'CV Dietlikon', N'Industriestrasse 28', 8305, N'Dietlikon', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763621, 1253861, N'MX756A15500', N'COO@15500', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15501, N'Coop Vitality', 21225, N'CV Muri', N'Muripark / Seetalstr. 1', 5630, N'Muri AG', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763622, 1253862, N'MX756A15501', N'COO@15501', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15502, N'Coop Vitality', 21227, N'CV Mellingen', N'Reusstalcenter Mellingen / Birrfeldstrasse 21', 5507, N'Mellingen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763623, 1253863, N'MX756A15502', N'COO@15502', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15503, N'Coop Vitality', 21228, N'CV Zürich-Wiedikon', N'Birmensdorferstr. 200', 8003, N'Zürich', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763624, 1253864, N'MX756A15503', N'COO@15503', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15504, N'Coop Vitality', 21230, N'CV Gossau', N'St. Gallerstrasse 75', 9200, N'Gossau', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763625, 1253865, N'MX756A15504', N'COO@15504', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15505, N'Coop Vitality', 21231, N'CV Basel Südpark', N'Südpark Bahnhof SBB', 4053, N'Basel', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763626, 1253866, N'MX756A15505', N'COO@15505', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15506, N'Coop Vitality', 21232, N'CV Feuerthalen', N'Coop Rhymarkt / Schützenstrasse 30', 8245, N'Feuerthalen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763627, 1253867, N'MX756A15506', N'COO@15506', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15507, N'Coop Vitality', 21233, N'CV Frauenfeld Schlosspark', N'EKZ Schlosspark / Zürcherstrasse 138', 8500, N'Frauenfeld', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763628, 1253868, N'MX756A15507', N'COO@15507', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15508, N'Coop Vitality', 21234, N'CV Egerkingen Gäupark', N'Gäupark / Hausimollstrasse 3', 4622, N'Egerkingen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763629, 1253869, N'MX756A15508', N'COO@15508', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15509, N'Coop Vitality', 21235, N'CV Chur City West', N'EKZ City West Chur / Raschärenstrasse 35', 7000, N'Chur', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763630, 1253870, N'MX756A15509', N'COO@15509', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15510, N'Coop Vitality', 21238, N'CV Thalwil', N'Florastrasse 1', 8800, N'Thalwil', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763631, 1253871, N'MX756A15510', N'COO@15510', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15511, N'Coop Vitality', 21502, N'CV Sant'' Antonino', N'Centro Manor / La Rotonda', 6592, N'S. Antonino', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763632, 1253872, N'MX756A15511', N'COO@15511', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15512, N'Coop Vitality', 21503, N'CV Canobbio', N'Coop Resega / Via Sonvico 5', 6952, N'Canobbio', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763633, 1253873, N'MX756A15512', N'COO@15512', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15513, N'Coop Vitality', 21239, N'CV Laufen', N'Bahnhofstrasse 16', 4242, N'Laufen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763634, 1253874, N'MX756A15513', N'COO@15513', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15514, N'Coop Vitality', 21244, N'CV Dietikon Silbern', N'Silbernstrasse 9', 8953, N'Dietikon', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763635, 1253875, N'MX756A15514', N'COO@15514', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15515, N'Coop Vitality', 21010, N'CV Gland', N'Allee du Communet 20 / Quartier Eikenott', 1196, N'Gland', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763636, 1253876, N'MX756A15515', N'COO@15515', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15516, N'Coop Vitality', 21011, N'CV Conthey', N'Bassin-Centre / Rue de la Madeleine 2', 1964, N'Conthey', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763637, 1253877, N'MX756A15516', N'COO@15516', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15517, N'Coop Vitality', 21246, N'CV Bern Europaplatz', N'Europaplatz 1a', 3008, N'Bern', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763638, 1253878, N'MX756A15517', N'COO@15517', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15518, N'Coop Vitality', 21247, N'CV Basel Pilger', N'Missionsstrasse 57', 4055, N'Basel', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763639, 1253879, N'MX756A15518', N'COO@15518', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15520, N'Coop Vitality', 21248, N'CV Kaiseraugst', N'Kaiserhof Center / Junkholzweg 3', 4303, N'Kaiseraugst', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763640, 1253880, N'MX756A15520', N'COO@15520', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15521, N'Coop Vitality', 21251, N'CV Weinfelden', N'Fichtenstrasse 18', 8570, N'Weinfelden', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763641, 1253881, N'MX756A15521', N'COO@15521', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15522, N'Coop Vitality', 21252, N'CV Baden', N'Langhaus 5', 5400, N'Baden', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763642, 1253882, N'MX756A15522', N'COO@15522', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15523, N'Coop Vitality', 21253, N'CV Biberist', N'Hauptstrasse 44', 4562, N'Biberist', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763643, 1253883, N'MX756A15523', N'COO@15523', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15524, N'Coop Vitality', 21254, N'CV Kriens Pilatus Markt', N'Pilatusmarkt / Ringstrasse 19', 6010, N'Kriens', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763644, 1253884, N'MX756A15524', N'COO@15524', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15525, N'Coop Vitality', 21256, N'CV Wohlen', N'Alte Bahnhofstrasse 2', 5610, N'Wohlen AG', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763645, 1253885, N'MX756A15525', N'COO@15525', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15526, N'Coop Vitality', 21504, N'CV Mendrisio', N'Via Giorgio Bernasconi 31', 6850, N'Mendrisio', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763646, 1253886, N'MX756A15526', N'COO@15526', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15527, N'Coop Vitality', 21261, N'CV Lenzburg', N'Augustin-Keller-Strasse 31', 5600, N'Lenzburg', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763647, 1253887, N'MX756A15527', N'COO@15527', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15528, N'Coop Vitality', 21263, N'CV Ins', N'Bahnhofstrasse 8', 3232, N'Ins', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763648, 1253888, N'MX756A15528', N'COO@15528', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15529, N'Coop Vitality', 21259, N'CV Rorschach', N'Marktplatz 12', 9400, N'Rorschach', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763649, 1253889, N'MX756A15529', N'COO@15529', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15530, N'Coop Vitality', 21255, N'CV Winterthur Stadtgarten', N'Bankstrasse 12', 8400, N'Winterthur', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763650, 1253890, N'MX756A15530', N'COO@15530', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15531, N'Coop Vitality', 21236, N'CV Jona', N'Allmeindstrasse 17', 8645, N'Rapperswil-Jona', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763651, 1253891, N'MX756A15531', N'COO@15531', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15532, N'Coop Vitality', 21240, N'CV Oerlikon Center Eleven', N'Center Eleven / Sophie Täuber-Strasse 4', 8050, N'Zürich', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763652, 1253892, N'MX756A15532', N'COO@15532', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15533, N'Coop Vitality', 21217, N'CV Oftringen Perry Center', N'Perry-Center / Bernstrasse 1', 4665, N'Oftringen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763653, 1253893, N'MX756A15533', N'COO@15533', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15534, N'Coop Vitality', 21250, N'CV Wallisellen', N'Bahnhofplatz 2', 8304, N'Wallisellen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763654, 1253894, N'MX756A15534', N'COO@15534', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15535, N'Coop Vitality', 21241, N'CV Haag', N'Haag Center / Im Rüti', 9469, N'Haag (Rheintal)', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763655, 1253895, N'MX756A15535', N'COO@15535', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15536, N'Coop Vitality', 21245, N'CV Grindelwald', N'Dorfstrasse 101', 3818, N'Grindelwald', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763656, 1253896, N'MX756A15536', N'COO@15536', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15537, N'Coop Vitality', 21012, N'CV Matran', N'Centre Matran / Route du Bois 1', 1753, N'Matran', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763657, 1253897, N'MX756A15537', N'COO@15537', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15538, N'Coop Vitality', 21215, N'CV Langenthal Bäregg', N'Bäregg Center / Bäreggstr. 10', 4900, N'Langenthal', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763658, 1253898, N'MX756A15538', N'COO@15538', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15539, N'Coop Vitality', 21264, N'CV Basel Erlenmatt', N'Erlenstrasse 81', 4058, N'Basel', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763659, 1253899, N'MX756A15539', N'COO@15539', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15540, N'Coop Vitality', 21014, N'CV Delémont', N'Route de Bâle 16', 2800, N'Delémont', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763660, 1253900, N'MX756A15540', N'COO@15540', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15541, N'Coop Vitality', 21266, N'CV St. Gallen Shopping Arena', N'Shopping Arena / Zürcherstrasse 462', 9015, N'St. Gallen', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763661, 1253901, N'MX756A15541', N'COO@15541', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15542, N'Coop Vitality', 21008, N'CV Agy', N'Centre commercial d''Agy / Route d''Agy 1', 1763, N'Agy', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763662, 1253902, N'MX756A15542', N'COO@15542', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15543, N'Coop Vitality', 21223, N'CV Lyss', N'Beundengasse 2', 3250, N'Lyss', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763663, 1253903, N'MX756A15543', N'COO@15543', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15544, N'Coop Vitality', 21007, N'CV Renens', N'Renens Centre / Place du Marché 1', 1020, N'Renens', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763664, 1253904, N'MX756A15544', N'COO@15544', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15545, N'Coop Vitality', 21015, N'CV Chatel-Saint-Denis', N'Chemin des Chardonnerets 14', 1618, N'Châtel-St-Denis', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763665, 1253905, N'MX756A15545', N'COO@15545', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15546, N'Coop Vitality', 21237, N'CV Frick', N'Hauptstrasse 37', 5070, N'Frick', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763667, 1253907, N'MX756A15546', N'COO@15546', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15547, N'Coop Vitality', 21229, N'CV Langnau', N'Ilfis Center / Sägerstrasse 37', 3550, N'Langnau i. E.', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763668, 1253908, N'MX756A15547', N'COO@15547', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15548, N'Coop Vitality', 21260, N'CV Oberwil Coop Center', N'Hauptstrasse 15', 4104, N'Oberwil', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763669, 1253909, N'MX756A15548', N'COO@15548', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15549, N'Coop Vitality', 21226, N'CV Zürich Letzipark', N'Einkaufszentrum Letzipark / Baslerstrasse 50', 8048, N'Zürich', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763670, 1253910, N'MX756A15549', N'COO@15549', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15551, N'Coop Vitality', 21220, N'CV Niederrohrdorf', N'Zentrum 2', 5443, N'Niederrohrdorf', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763672, 1253912, N'MX756A15551', N'COO@15551', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15552, N'Coop Vitality', 21268, N'CV Bubendorf', N'Gewerbestrasse 1', 4416, N'Bubendorf', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763673, 1253913, N'MX756A15552', N'COO@15552', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15554, N'Coop Vitality', 21016, N'CV Vich', N'Chemin de la Bichette 4', 1267, N'Vich', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763674, 1253914, N'MX756A15554', N'COO@15554', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15555, N'Coop Vitality', 21267, N'CV Langenthal Tell', N'St. Urbanstrasse 3', 4900, N'Langenthal', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763675, 1253915, N'MX756A15555', N'COO@15555', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15556, N'Coop Vitality', 21257, N'CV Flims', N'Via Nova 80', 7017, N'Flims Dorf', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763676, 1253916, N'MX756A15556', N'COO@15556', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15557, N'Coop Vitality', 21269, N'CV Chur Quader', N'Quader Center / Masanserstrasse 14', 7000, N'Chur', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763677, 1253917, N'MX756A15557', N'COO@15557', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15558, N'Coop Vitality', 21272, N'CV Huttwil', N'Bahnhofstrasse 43', 4950, N'Huttwil', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763678, 1253918, N'MX756A15558', N'COO@15558', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15559, N'Coop Vitality', 21271, N'CV Bern Freudenberg', N'Giacomettistrasse 15', 3006, N'Bern', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763679, 1253919, N'MX756A15559', N'COO@15559', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15560, N'Coop Vitality', 21273, N'CV Zürich Stauffacher', N'Badenerstrasse 15', 8004, N'Zürich', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763680, 1253920, N'MX756A15560', N'COO@15560', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15562, N'Coop Vitality', 21013, N'CV Murten', N'Löwenbergstrasse 54', 3280, N'Murten', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763682, 1253922, N'MX756A15562', N'COO@15562', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL), + (15563, N'Coop Vitality', 21275, N'CV Oberwil Mühlematt', N'Mühlemattstrasse 34', 4104, N'Oberwil', N'Coop Vitalty AG, Bern / CHE-107.892.180 MWST', 763683, 1253923, N'MX756A15563', N'COO@15563', N'Coop Vitalty AG, Zentraler Rechnungseingang 11962, Postfach, 3001 Bern', N'frw-kreditoren@galenicare.com', NULL); +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - populated data from excel. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; +--#endregion excel datas + +--#region encode passwords +UPDATE s + SET s.[encoded_password] = [Arizona].dbo.[aps_String_Encode](s.[Password], '', 667767) +FROM [#ocptdba_713] s +WHERE s.[Password] IS NOT NULL +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - Encoded passwrods. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + +--#endregion encode passwords + +--#region prepare batches in excel data + +--AMA +UPDATE S +SET [s].[execution_date] = CAST('20230807' AS DATETIME2(0)) +FROM [#ocptdba_713] S +WHERE [S].[Alias (Format)] = 'Amavita' +AND [skip_insert] = 0 +AND s.[ShopNr] in ( + 15225 + ,15226 + ,15227 + ,15350 + ,15359 + ,15228 + ,15343 + ,15349 + ,15229 + ,15230 + ,15231 + ,15232 + ,15233 + ,15234 + ,15235 + ,15341 + ,15380 + ,15338 + ,15339 + ,15236 + ,15325 + ,15237 + ,15238 + ,15239 + ,15240 + ,15241 + ,15242 + ,15375 + ,15243 + ,15244 + ,15245 + ,15246 + ,15247 + ,15248 + ,13223 + ,15249 + ,15250 + ,13274 + ,11606 + ,15373 + ,15337 + ,15251 + ,15253 + ,15374 + ,15254 + ,15372 + ,15255 + ,15256 + ,15257 + ,15363 + ,9522 + ,13222 + ,10736 + ,11816 + ,15136 + ,11875 + ,13607 + ,15258 + ,15348 + ,15358 + ,15368 + ,15252 + ,15309 + ,15357 + ,15355 + ,15312 + ,13224 + ,15319 + ,15320 + ,15321 + ,15324 + ,15342 + ,15361 + ,15335 + ,15347 + ,14138 + ,15344 + ,15311 + ,15379 + ,15302 + ,15365 + ,15381 + ,15371 + ,15377 + ,15378 +); +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - flagged 1st half of AMA for update on the 07.08. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + +UPDATE s + SET [s].[execution_date] = CAST('20230808' AS DATETIME2(0)) +FROM [#ocptdba_713] s +WHERE [s].[Alias (Format)] = 'Amavita' +AND [s].[skip_insert] = 0 +AND [execution_date] IS NULL; +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - flagged 2nd half of AMA for update on the 08.08. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + +UPDATE s +SET [s].[execution_date] = CASE + --WHEN [s].[Alias (Format)] = 'Amavita' THEN CAST('20230807' AS DATETIME2(0)) + WHEN [s].[Alias (Format)] = 'Coop Vitality' THEN CAST('20230809' AS DATETIME2(0)) + WHEN [s].[Alias (Format)] = 'Sun Store' THEN CAST('20230814' AS DATETIME2(0)) +END +FROM [#ocptdba_713] s +WHERE [s].[skip_insert] = 0 +AND [execution_date] IS NULL +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - Set batch execution dates for CVI and SUN. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + +--#endregion prepare batches in excel data + +--#region remove data that should be ignored +UPDATE s SET [s].[skip_insert] = 1 +FROM [#ocptdba_713] s +WHERE [ShopNr] IS NULL +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - removed incomplete excel data. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; +--#endregion remove data that should be ignored + +--#region fetch OU +UPDATE s SET [s].[OU_code] = [ou].[OU_code], s.[OU_id] = ou.[Organizational_unit_ID] +--SELECT s.[ShopName], s.[Address], ou.[OU_short_name], a.[AD_address_1], [ou].[OU_code] +FROM [dbo].[Profit_cost_center_key] cck + JOIN [dbo].[Fiscal_year] fy ON fy.[Fiscal_year_ID] = cck.[PCCK_fiscal_year] + JOIN [dbo].[Organizational_unit] ou ON ou.[OU_profit_cost_center] = cck.[PCCK_profit_cost_center] + JOIN [dbo].[Address] a ON a.[Address_ID] = ou.[OU_address] + JOIN [#ocptdba_713] s ON s.[KST ] = cck.[PCCK_key] +WHERE [cck].[PCCK_type] = 3 +AND [fy].[FY_number] = DATEPART(YEAR, CURRENT_TIMESTAMP) +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - Fetched OU code. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; +--#endregion fetch OU + +--#region set pilot dates +UPDATE s SET [s].[execution_date]='20230731' +FROM [#ocptdba_713] s +WHERE [OU_code] IN ('085','280','521','835') +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - set execution date on 4 pilots. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; +--#endregion set pilot dates + +--#region flag closed OU as to skip +UPDATE s SET [s].[skip_insert] = 1 +FROM [dbo].[Organizational_unit] ou + JOIN [#ocptdba_713] s ON s.[OU_id] = ou.[Organizational_unit_ID] + --JOIN [dbo].[OU_store_history] oush ON oush.[OUSH_organizational_unit] = ou.[Organizational_unit_ID] + JOIN ( + SELECT + [h].[OUSH_organizational_unit], + [h].[OUSH_end_date], + ROW_NUMBER()OVER(PARTITION BY [h].[OUSH_organizational_unit] ORDER BY [h].[OUSH_start_date] DESC) AS rnk + FROM [dbo].[OU_store_history] h + )oush ON oush.[OUSH_organizational_unit] = ou.[Organizational_unit_ID] AND oush.[rnk] = 1 +WHERE [oush].[OUSH_end_date] IS NOT NULL +AND [oush].[OUSH_end_date] < CURRENT_TIMESTAMP +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - flagged data to be skipped because OU is closed. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; +--#endregion flag closed OU as to skip + +--#region flag data for future batches as "skip" +IF @dbg = 0 +BEGIN + UPDATE s + SET [skip_insert] = 1 + FROM [#ocptdba_713] s + WHERE s.[execution_date] > CURRENT_TIMESTAMP + PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - not executing updates for a future date. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; +END +--#endregion flag data for future batches as "skip" + +--#region test on a single ou +IF NULLIF(@ou_only,'') IS NOT NULL +BEGIN + DELETE FROM [#ocptdba_713] WHERE [OU_code] <> @ou_only; + PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - Only inserting for 1 OU. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + +END +--#endregion test on a single ou + +--#region insert wsa_connection +DECLARE @out_wsac TABLE(id GUID_identifier NOT NULL) + +INSERT INTO [dbo].[WSA_connection] ([WSA_connection_GUID], + [WSAC_web_service_access], + [WSAC_organizational_unit], + [WSAC_url], + [WSAC_login], + [WSAC_password], + [WSAC_company_code], + [WSAC_pharmacy_code]) +OUTPUT inserted.[WSA_connection_GUID] INTO @out_wsac ( [id] ) +SELECT + NEWID() AS [WSA_connection_GUID], + ws.[id] AS [WSAC_web_service_access], + s.[OU_id] AS [WSAC_organizational_unit], + CASE + WHEN ws.[name]='apswsVatGlobalBlue' THEN 'https://ic2integra.globalblue.com/ui/integra' + WHEN ws.[name]='apswsVatGlobalBlueReprint' THEN 'https://ic2integrawag.globalblue.com/api/TfsIssuingService/ReprintRenderedCheque' + WHEN ws.[name]='apswsVatGlobalBlueToken' THEN 'https://ic2integrawag.globalblue.com/api/UserAuthentication/RequestSessionToken' + WHEN ws.[name]='apswsVatGlobalBlueVoid' THEN 'https://ic2integrawag.globalblue.com/api/TfsIssuingService/VoidCheque' + END AS [WSAC_url], + CASE + WHEN ws.[name] = 'apswsVatGlobalBlueToken' THEN s.[Username] + ELSE NULL + END AS [WSAC_login], + CASE + WHEN ws.[name] = 'apswsVatGlobalBlueToken' THEN s.[encoded_password] + ELSE NULL + END AS [WSAC_password], + CASE + WHEN ws.[name] = 'apswsVatGlobalBlueToken' THEN s.[Shop ID]+';'+s.[Desk ID] + WHEN ws.[name] = 'apswsVatGlobalBlue' THEN s.[Shop ID]+';'+s.[Desk ID] + ELSE NULL + END AS [WSAC_company_code], + @phcy_code AS [WSAC_pharmacy_code] +FROM [#ocptdba_713] s + CROSS JOIN @services ws +WHERE s.[skip_insert] = 0 +AND NOT EXISTS( + SELECT 1 + FROM [dbo].[WSA_connection] w + WHERE w.[WSAC_web_service_access] = ws.[id] + AND w.[WSAC_organizational_unit] = s.[OU_id] +) +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - inserted WSA_connection entries. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; +--#endregion insert wsa_connection + +--SELECT * +--FROM [#ocptdba_713] +------WHERE [skip_insert] = 1 +--ORDER BY [Alias (Format)] + +--#region inserted wsa_connection +SELECT ou.[OU_short_name], [su].[SUB_prefix], [ou].[OU_code], ws.[WSA_code], w.[WSAC_url], [w].[WSAC_login], [w].[WSAC_password], [w].[WSAC_company_code] +FROM @out_wsac o + JOIN [dbo].[WSA_connection] w ON w.[WSA_connection_GUID] = o.[id] + JOIN [dbo].[Organizational_unit] ou ON ou.[Organizational_unit_ID] = w.[WSAC_organizational_unit] + JOIN [dbo].[Subsidiary] su ON su.[Subsidiary_ID] = ou.[OU_subsidiary] + JOIN [dbo].[Web_service_access] ws ON ws.[Web_service_access_GUID] = w.[WSAC_web_service_access] +ORDER BY ou.[OU_code], [ou].[OU_short_name], w.[WSAC_web_service_access] +--#endregion inserted wsa_connection + +ROLLBACK TRANSACTION +--COMMIT TRANSACTION \ No newline at end of file