March 31, 2023 at 10:38 am
I want to be able to recursively go through the contents of a temp table without using a loop and complete at the last record (ID = 4)
and perform a set of statements
my data looks like this
DROP TABLE IF EXISTS [#ChannelInfo]
CREATE TABLE [#ChannelInfo](
[ID] [bigint] NULL,
[SerialNumber] [nvarchar](60) NULL,
[channelid] [int] NULL
) ON [PRIMARY]
GO
INSERT INTO [#ChannelInfo] ([ID], [SerialNumber],[channelid])
SELECT 1 AS ID, 939029 AS [SerialNumber], 12 as ChannelID
UNION ALL
SELECT 2 AS ID, 939029 AS [SerialNumber], 13 as ChannelID
UNION ALL
SELECT 3 AS ID, 939029 AS [SerialNumber], 14 as ChannelID
UNION ALL
SELECT 4 AS ID, 939029 AS [SerialNumber], 15 as ChannelID
i then tried the following statement but the recursion does not terminate at ID = 4
;with cte as
(
select * from [#ChannelInfo]
union all
select t.* from cte
inner join [#ChannelInfo] t on cte.id = t.id + 1
)
select * from cte a
What am I doing wrong here?
March 31, 2023 at 11:18 am
Not sure what you mean by 'Complete at the last record'. What results are you hoping to see?
The absence of evidence is not evidence of absence
- Martin Rees
The absence of consumable DDL, sample data and desired results is, however, evidence of the absence of my response
- Phil Parkin
March 31, 2023 at 11:31 am
Not sure what you mean by 'Complete at the last record'. What results are you hoping to see?
I want to get to the last record
but i thinik ive found the solution
select * from [#ChannelInfo] where ID = 1
union all
select t.* from cte
inner join [#ChannelInfo] t on t.id = cte.id + 1
March 31, 2023 at 11:35 am
Phil Parkin wrote:Not sure what you mean by 'Complete at the last record'. What results are you hoping to see?
I want to get to the last record
but i thinik ive found the solution
select * from [#ChannelInfo] where ID = 1 union all select t.* from cte inner join [#ChannelInfo] t on t.id = cte.id + 1
This gives the same result as
SELECT *
FROM #ChannelInfo ci;
The absence of evidence is not evidence of absence
- Martin Rees
The absence of consumable DDL, sample data and desired results is, however, evidence of the absence of my response
- Phil Parkin
March 31, 2023 at 11:37 am
'Get to the last record' still makes no sense to me. Once again, I suggest you provide the output you are hoping for.
The absence of evidence is not evidence of absence
- Martin Rees
The absence of consumable DDL, sample data and desired results is, however, evidence of the absence of my response
- Phil Parkin
March 31, 2023 at 11:46 am
Ok im going to expand on this.
Ive got to loop through this table and build set of Merge statements.
Currently I am using Loop based logic to extract and execute a set of Merge statements
But I want to avoid using loop based logic and do this as 1 statement and thought that using a recursive CTE
here is more detail
CREATE TABLE [#DeviceChannel](
[SerialNumber] [nvarchar](255) NOT NULL,
[ChannelId] [int] NOT NULL,
[DeviceChannelID] [uniqueidentifier] NOT NULL,
[ChannelReadingTableName] [nvarchar](4000) NULL,
[MainLevelDataTableName] [nvarchar](4000) NULL,
[TableRecordCountsTableName] [nvarchar](4000) NULL
) ON [PRIMARY]
GO
INSERT [#DeviceChannel] ([SerialNumber], [ChannelId], [DeviceChannelID], [ChannelReadingTableName], [MainLevelDataTableName], [TableRecordCountsTableName]) VALUES (N'939029', 12, N'92af1762-03b6-4918-9eec-157a7569e950', N'[ChannelReading_939029_12_92AF1762-03B6-4918-9EEC-157A7569E950]', N'[ChannelReading_939029_12_92AF1762-03B6-4918-9EEC-157A7569E950_MainLevelData]', N'[ChannelReading_939029_12_92AF1762-03B6-4918-9EEC-157A7569E950_MainLevelData_TableRecordCounts]')
GO
INSERT [#DeviceChannel] ([SerialNumber], [ChannelId], [DeviceChannelID], [ChannelReadingTableName], [MainLevelDataTableName], [TableRecordCountsTableName]) VALUES (N'939029', 13, N'aeb97900-e840-4143-bdbd-364d69838191', N'[ChannelReading_939029_13_AEB97900-E840-4143-BDBD-364D69838191]', N'[ChannelReading_939029_13_AEB97900-E840-4143-BDBD-364D69838191_MainLevelData]', N'[ChannelReading_939029_13_AEB97900-E840-4143-BDBD-364D69838191_MainLevelData_TableRecordCounts]')
GO
INSERT [#DeviceChannel] ([SerialNumber], [ChannelId], [DeviceChannelID], [ChannelReadingTableName], [MainLevelDataTableName], [TableRecordCountsTableName]) VALUES (N'939029', 14, N'108c449f-8808-4f41-b41e-6bee2d1a4e3a', N'[ChannelReading_939029_14_108C449F-8808-4F41-B41E-6BEE2D1A4E3A]', N'[ChannelReading_939029_14_108C449F-8808-4F41-B41E-6BEE2D1A4E3A_MainLevelData]', N'[ChannelReading_939029_14_108C449F-8808-4F41-B41E-6BEE2D1A4E3A_MainLevelData_TableRecordCounts]')
GO
INSERT [#DeviceChannel] ([SerialNumber], [ChannelId], [DeviceChannelID], [ChannelReadingTableName], [MainLevelDataTableName], [TableRecordCountsTableName]) VALUES (N'939029', 15, N'27c51350-c2ba-4c67-87f7-f91f56093036', N'[ChannelReading_939029_15_27C51350-C2BA-4C67-87F7-F91F56093036]', N'[ChannelReading_939029_15_27C51350-C2BA-4C67-87F7-F91F56093036_MainLevelData]', N'[ChannelReading_939029_15_27C51350-C2BA-4C67-87F7-F91F56093036_MainLevelData_TableRecordCounts]')
GO
Now when i run the following
;with cte as
(
select * from [#ChannelInfo] where ID = 1
union all
select t.* from cte
inner join [#ChannelInfo] t on t.id = cte.id + 1
)
select 'MERGE ' + dc.ChannelReadingTableName + ' USING ' + DC.[MainLevelDataTableName] from cte
join
[#DeviceChannel] dc on cte.channelid = dc.ChannelId
I get the following(not complete..just code snippet)
MERGE [ChannelReading_939029_12_92AF1762-03B6-4918-9EEC-157A7569E950] USING [ChannelReading_939029_12_92AF1762-03B6-4918-9EEC-157A7569E950_MainLevelData]
MERGE [ChannelReading_939029_13_AEB97900-E840-4143-BDBD-364D69838191] USING [ChannelReading_939029_13_AEB97900-E840-4143-BDBD-364D69838191_MainLevelData]
MERGE [ChannelReading_939029_14_108C449F-8808-4F41-B41E-6BEE2D1A4E3A] USING [ChannelReading_939029_14_108C449F-8808-4F41-B41E-6BEE2D1A4E3A_MainLevelData]
MERGE [ChannelReading_939029_15_27C51350-C2BA-4C67-87F7-F91F56093036] USING [ChannelReading_939029_15_27C51350-C2BA-4C67-87F7-F91F56093036_MainLevelData]
March 31, 2023 at 11:57 am
The output you get from your query is the same as
SELECT 'MERGE ' + dc.ChannelReadingTableName + ' USING ' + dc.MainLevelDataTableName
FROM #DeviceChannel dc;
The absence of evidence is not evidence of absence
- Martin Rees
The absence of consumable DDL, sample data and desired results is, however, evidence of the absence of my response
- Phil Parkin
March 31, 2023 at 12:01 pm
I think you might want this for a recursive CTE:
;with cte as
(
select *
from [#ChannelInfo]
where id = 1 -- Anchor part of CTE
union all
select t.*
from cte
inner join [#ChannelInfo] t
on cte.id = t.id - 1
)
select *
from cte a
March 31, 2023 at 4:26 pm
I'm curious... why do you think you need any form of looping for this?
SELECT CONCAT('MERGE ',ChannelReadingTableName,' USING ',MainLevelDataTableName)
FROM #DeviceChannel
And, be aware... I used the table name you provided for test data, which doesn't match the table name you used in your example code.
--Jeff Moden
Change is inevitable... Change for the better is not.
Viewing 9 posts - 1 through 8 (of 8 total)
You must be logged in to reply to this topic. Login to reply