Grabbing each row's Data and setting it to Variable - TSQLIs there a way to loop through a table variable in TSQL without using a cursor?How do I generate random number for each row in a TSQL Select?How to set variable from a SQL query?Access Stored Procedure Parameters with Dynamic SQLRows to comma separated, vertical to horizontal, values in SQL ServerSQL Select Multiple Part of string!SQL statement which returns id and splits comma separated valuesHow to eliminate Nulls, and insert with split delimterCursor Usage in SQL ServerHow can I retrieve first second and third word of a String in SQL?
What would be the challenges to taking off and landing a typical passenger jet at FL300?
Why in most German places is the church the tallest building?
Compelling story with the world as a villain
Architectural feasibility of a tiered circular stone keep
Why do gliders have bungee cords in the control systems and what do they do? Are they on all control surfaces? What about ultralights?
What is the difference between "Grippe" and "Männergrippe"?
Are modern clipless shoes and pedals that much better than toe clips and straps?
Is it possible to perform a regression where you have an unknown / unknowable feature variable?
Command in bash shell script to find path to that script?
Prove your innocence
How to gently end involvement with an online community?
LeetCode: Group Anagrams C#
How do I request a longer than normal leave of absence period for my wedding?
Can a Rogue PC teach an NPC to perform Sneak Attack?
What is a CirKle Word™?
I don't have the theoretical background in my PhD topic. I can't justify getting the degree
Would it be possible to have a GMO that produces chocolate?
Why did MS-DOS applications built using Turbo Pascal fail to start with a division by zero error on faster systems?
Why doesn't 'd /= d' throw a division by zero exception?
Why do banks “park” their money at the European Central Bank?
Is there any method of inflicting the incapacitated condition and no other condition?
Why did this happen to Thanos's ships at the end of "Avengers: Endgame"?
Converting a set into a string
Handling Disruptive Student on the Autistic Spectrum
Grabbing each row's Data and setting it to Variable - TSQL
Is there a way to loop through a table variable in TSQL without using a cursor?How do I generate random number for each row in a TSQL Select?How to set variable from a SQL query?Access Stored Procedure Parameters with Dynamic SQLRows to comma separated, vertical to horizontal, values in SQL ServerSQL Select Multiple Part of string!SQL statement which returns id and splits comma separated valuesHow to eliminate Nulls, and insert with split delimterCursor Usage in SQL ServerHow can I retrieve first second and third word of a String in SQL?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I'm trying to create a loop that will pull out one value of a row and store it to a variable(@nameString). I need this to happen for an unknown amount of rows. What should I be referring to when I'm I need this loop to cycle through all of the rows and update my variable each time it loops with the next rows value.
I have tried a few counter loops and they do not cycle through the rows they just keep hitting the same one.
-- Code for parsing a name with multiple parts
DECLARE @nameString as varchar(max),
@firstSpaceLoc as smallint,
@secondSpaceLoc as smallint,
@thirdSpaceLoc as smallint,
@firstString as varchar(max),
@secondString as varchar(max),
@thirdString as varchar(max)
-- I'm expecting the loop to be below here!
SET @nameString = 'Robert Dobson, Jr.'
--SET @nameString = 'Robert William Dobson, Sr.'
-- How many strings are in the name?
-- Is there one space in the name
SET @firstSpaceLoc = CHARINDEX(' ',@namestring,1)
-- Is there second space in the name
SET @secondSpaceLoc = CHARINDEX(' ', @namestring, CHARINDEX(' ',@nameString,1)+1)
-- Is there a third space in the name
SET @thirdSpaceLoc =
CASE
WHEN CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1) = 0 THEN 0
WHEN CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1) > 0 THEN
CHARINDEX(' ', @namestring,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)+1)
END
SELECT
@nameString sourceString,
CASE
WHEN @firstSpaceLoc > 0 THEN 'There is one space'
ELSE 'There is not one space'
END [Is there one space],
CASE
WHEN @secondSpaceLoc > 0 THEN 'There is a second space'
ELSE 'There is not a second space'
END [Is there a second space],
CASE
WHEN @thirdSpaceLoc > 0 THEN 'There is a third space'
ELSE 'There is not a third space'
END [Is there a third space]
-- extract and save strings
SELECT
@firstString =
CASE
WHEN @firstSpaceLoc > 0 THEN LEFT(@nameString,CHARINDEX(' ',@namestring,1)-1)
ELSE @nameString
END,
@secondString =
CASE
WHEN @firstSpaceLoc = 0 THEN ''
WHEN @secondSpaceLoc = 0 THEN
RIGHT(@namestring, LEN(@namestring)- CHARINDEX(' ',@namestring,1))
WHEN @secondSpaceLoc > 0 THEN
REPLACE (
SUBSTRING (
@nameString,
CHARINDEX(' ',@namestring,1)+1,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)
- CHARINDEX(' ',@namestring,1)
),
',',
''
)
ELSE ''
END,
@thirdString =
CASE
WHEN @firstSpaceLoc = 0 OR @secondSpaceLoc = 0 THEN ''
WHEN @secondSpaceLoc > 0
AND @thirdSpaceLoc = 0 THEN
SUBSTRING (
@nameString,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)+1,
LEN(@nameString)
)
ELSE RIGHT(@namestring,LEN(@namestring) - @secondSpaceLoc)
END
-- Report names
SELECT
@nameString sourceString,
@firstString [First string],
@secondString [Second string],
@thirdString [Third string]
SELECT
CASE
WHEN @thirdSpaceLoc > 0 THEN
@thirdString + ', ' + @firstString + ' ' + @secondString
WHEN @secondSpaceLoc > 0 AND @thirdSpaceLoc = 0 THEN
@secondString + ' ' + @thirdString + ', ' + @firstString
WHEN @firstSpaceLoc > 0 THEN
@secondString + ', ' + @firstString
WHEN @firstSpaceLoc = 0 THEN
@firstString
END [Reported Name]
Expected results is that this goes through and separate every row in a column with multiple spaces to a long list of name that are separated. This list but a lot longer.
sql-server tsql
|
show 4 more comments
I'm trying to create a loop that will pull out one value of a row and store it to a variable(@nameString). I need this to happen for an unknown amount of rows. What should I be referring to when I'm I need this loop to cycle through all of the rows and update my variable each time it loops with the next rows value.
I have tried a few counter loops and they do not cycle through the rows they just keep hitting the same one.
-- Code for parsing a name with multiple parts
DECLARE @nameString as varchar(max),
@firstSpaceLoc as smallint,
@secondSpaceLoc as smallint,
@thirdSpaceLoc as smallint,
@firstString as varchar(max),
@secondString as varchar(max),
@thirdString as varchar(max)
-- I'm expecting the loop to be below here!
SET @nameString = 'Robert Dobson, Jr.'
--SET @nameString = 'Robert William Dobson, Sr.'
-- How many strings are in the name?
-- Is there one space in the name
SET @firstSpaceLoc = CHARINDEX(' ',@namestring,1)
-- Is there second space in the name
SET @secondSpaceLoc = CHARINDEX(' ', @namestring, CHARINDEX(' ',@nameString,1)+1)
-- Is there a third space in the name
SET @thirdSpaceLoc =
CASE
WHEN CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1) = 0 THEN 0
WHEN CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1) > 0 THEN
CHARINDEX(' ', @namestring,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)+1)
END
SELECT
@nameString sourceString,
CASE
WHEN @firstSpaceLoc > 0 THEN 'There is one space'
ELSE 'There is not one space'
END [Is there one space],
CASE
WHEN @secondSpaceLoc > 0 THEN 'There is a second space'
ELSE 'There is not a second space'
END [Is there a second space],
CASE
WHEN @thirdSpaceLoc > 0 THEN 'There is a third space'
ELSE 'There is not a third space'
END [Is there a third space]
-- extract and save strings
SELECT
@firstString =
CASE
WHEN @firstSpaceLoc > 0 THEN LEFT(@nameString,CHARINDEX(' ',@namestring,1)-1)
ELSE @nameString
END,
@secondString =
CASE
WHEN @firstSpaceLoc = 0 THEN ''
WHEN @secondSpaceLoc = 0 THEN
RIGHT(@namestring, LEN(@namestring)- CHARINDEX(' ',@namestring,1))
WHEN @secondSpaceLoc > 0 THEN
REPLACE (
SUBSTRING (
@nameString,
CHARINDEX(' ',@namestring,1)+1,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)
- CHARINDEX(' ',@namestring,1)
),
',',
''
)
ELSE ''
END,
@thirdString =
CASE
WHEN @firstSpaceLoc = 0 OR @secondSpaceLoc = 0 THEN ''
WHEN @secondSpaceLoc > 0
AND @thirdSpaceLoc = 0 THEN
SUBSTRING (
@nameString,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)+1,
LEN(@nameString)
)
ELSE RIGHT(@namestring,LEN(@namestring) - @secondSpaceLoc)
END
-- Report names
SELECT
@nameString sourceString,
@firstString [First string],
@secondString [Second string],
@thirdString [Third string]
SELECT
CASE
WHEN @thirdSpaceLoc > 0 THEN
@thirdString + ', ' + @firstString + ' ' + @secondString
WHEN @secondSpaceLoc > 0 AND @thirdSpaceLoc = 0 THEN
@secondString + ' ' + @thirdString + ', ' + @firstString
WHEN @firstSpaceLoc > 0 THEN
@secondString + ', ' + @firstString
WHEN @firstSpaceLoc = 0 THEN
@firstString
END [Reported Name]
Expected results is that this goes through and separate every row in a column with multiple spaces to a long list of name that are separated. This list but a lot longer.
sql-server tsql
Is another application calling this query/procedure? Or is this just meant to run inside of SQL-Server?
– Ryan Wilson
Mar 27 at 17:29
It is just meant to run in SQL server. No SP or applications
– NeoAer
Mar 27 at 17:30
Why do you think you need a loop? They are horribly inefficient.
– Sean Lange
Mar 27 at 17:37
Why not use STRING_SPLIT, then PIVOT your result?
– Robert Sievers
Mar 27 at 17:37
No the above code works just fine if copied into T-SQL as a standalone. The issue i'm having trying to figure out is how to loop this and capture each rows information.
– NeoAer
Mar 27 at 17:39
|
show 4 more comments
I'm trying to create a loop that will pull out one value of a row and store it to a variable(@nameString). I need this to happen for an unknown amount of rows. What should I be referring to when I'm I need this loop to cycle through all of the rows and update my variable each time it loops with the next rows value.
I have tried a few counter loops and they do not cycle through the rows they just keep hitting the same one.
-- Code for parsing a name with multiple parts
DECLARE @nameString as varchar(max),
@firstSpaceLoc as smallint,
@secondSpaceLoc as smallint,
@thirdSpaceLoc as smallint,
@firstString as varchar(max),
@secondString as varchar(max),
@thirdString as varchar(max)
-- I'm expecting the loop to be below here!
SET @nameString = 'Robert Dobson, Jr.'
--SET @nameString = 'Robert William Dobson, Sr.'
-- How many strings are in the name?
-- Is there one space in the name
SET @firstSpaceLoc = CHARINDEX(' ',@namestring,1)
-- Is there second space in the name
SET @secondSpaceLoc = CHARINDEX(' ', @namestring, CHARINDEX(' ',@nameString,1)+1)
-- Is there a third space in the name
SET @thirdSpaceLoc =
CASE
WHEN CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1) = 0 THEN 0
WHEN CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1) > 0 THEN
CHARINDEX(' ', @namestring,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)+1)
END
SELECT
@nameString sourceString,
CASE
WHEN @firstSpaceLoc > 0 THEN 'There is one space'
ELSE 'There is not one space'
END [Is there one space],
CASE
WHEN @secondSpaceLoc > 0 THEN 'There is a second space'
ELSE 'There is not a second space'
END [Is there a second space],
CASE
WHEN @thirdSpaceLoc > 0 THEN 'There is a third space'
ELSE 'There is not a third space'
END [Is there a third space]
-- extract and save strings
SELECT
@firstString =
CASE
WHEN @firstSpaceLoc > 0 THEN LEFT(@nameString,CHARINDEX(' ',@namestring,1)-1)
ELSE @nameString
END,
@secondString =
CASE
WHEN @firstSpaceLoc = 0 THEN ''
WHEN @secondSpaceLoc = 0 THEN
RIGHT(@namestring, LEN(@namestring)- CHARINDEX(' ',@namestring,1))
WHEN @secondSpaceLoc > 0 THEN
REPLACE (
SUBSTRING (
@nameString,
CHARINDEX(' ',@namestring,1)+1,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)
- CHARINDEX(' ',@namestring,1)
),
',',
''
)
ELSE ''
END,
@thirdString =
CASE
WHEN @firstSpaceLoc = 0 OR @secondSpaceLoc = 0 THEN ''
WHEN @secondSpaceLoc > 0
AND @thirdSpaceLoc = 0 THEN
SUBSTRING (
@nameString,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)+1,
LEN(@nameString)
)
ELSE RIGHT(@namestring,LEN(@namestring) - @secondSpaceLoc)
END
-- Report names
SELECT
@nameString sourceString,
@firstString [First string],
@secondString [Second string],
@thirdString [Third string]
SELECT
CASE
WHEN @thirdSpaceLoc > 0 THEN
@thirdString + ', ' + @firstString + ' ' + @secondString
WHEN @secondSpaceLoc > 0 AND @thirdSpaceLoc = 0 THEN
@secondString + ' ' + @thirdString + ', ' + @firstString
WHEN @firstSpaceLoc > 0 THEN
@secondString + ', ' + @firstString
WHEN @firstSpaceLoc = 0 THEN
@firstString
END [Reported Name]
Expected results is that this goes through and separate every row in a column with multiple spaces to a long list of name that are separated. This list but a lot longer.
sql-server tsql
I'm trying to create a loop that will pull out one value of a row and store it to a variable(@nameString). I need this to happen for an unknown amount of rows. What should I be referring to when I'm I need this loop to cycle through all of the rows and update my variable each time it loops with the next rows value.
I have tried a few counter loops and they do not cycle through the rows they just keep hitting the same one.
-- Code for parsing a name with multiple parts
DECLARE @nameString as varchar(max),
@firstSpaceLoc as smallint,
@secondSpaceLoc as smallint,
@thirdSpaceLoc as smallint,
@firstString as varchar(max),
@secondString as varchar(max),
@thirdString as varchar(max)
-- I'm expecting the loop to be below here!
SET @nameString = 'Robert Dobson, Jr.'
--SET @nameString = 'Robert William Dobson, Sr.'
-- How many strings are in the name?
-- Is there one space in the name
SET @firstSpaceLoc = CHARINDEX(' ',@namestring,1)
-- Is there second space in the name
SET @secondSpaceLoc = CHARINDEX(' ', @namestring, CHARINDEX(' ',@nameString,1)+1)
-- Is there a third space in the name
SET @thirdSpaceLoc =
CASE
WHEN CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1) = 0 THEN 0
WHEN CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1) > 0 THEN
CHARINDEX(' ', @namestring,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)+1)
END
SELECT
@nameString sourceString,
CASE
WHEN @firstSpaceLoc > 0 THEN 'There is one space'
ELSE 'There is not one space'
END [Is there one space],
CASE
WHEN @secondSpaceLoc > 0 THEN 'There is a second space'
ELSE 'There is not a second space'
END [Is there a second space],
CASE
WHEN @thirdSpaceLoc > 0 THEN 'There is a third space'
ELSE 'There is not a third space'
END [Is there a third space]
-- extract and save strings
SELECT
@firstString =
CASE
WHEN @firstSpaceLoc > 0 THEN LEFT(@nameString,CHARINDEX(' ',@namestring,1)-1)
ELSE @nameString
END,
@secondString =
CASE
WHEN @firstSpaceLoc = 0 THEN ''
WHEN @secondSpaceLoc = 0 THEN
RIGHT(@namestring, LEN(@namestring)- CHARINDEX(' ',@namestring,1))
WHEN @secondSpaceLoc > 0 THEN
REPLACE (
SUBSTRING (
@nameString,
CHARINDEX(' ',@namestring,1)+1,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)
- CHARINDEX(' ',@namestring,1)
),
',',
''
)
ELSE ''
END,
@thirdString =
CASE
WHEN @firstSpaceLoc = 0 OR @secondSpaceLoc = 0 THEN ''
WHEN @secondSpaceLoc > 0
AND @thirdSpaceLoc = 0 THEN
SUBSTRING (
@nameString,
CHARINDEX(' ', @namestring,
CHARINDEX(' ',@nameString,1)+1)+1,
LEN(@nameString)
)
ELSE RIGHT(@namestring,LEN(@namestring) - @secondSpaceLoc)
END
-- Report names
SELECT
@nameString sourceString,
@firstString [First string],
@secondString [Second string],
@thirdString [Third string]
SELECT
CASE
WHEN @thirdSpaceLoc > 0 THEN
@thirdString + ', ' + @firstString + ' ' + @secondString
WHEN @secondSpaceLoc > 0 AND @thirdSpaceLoc = 0 THEN
@secondString + ' ' + @thirdString + ', ' + @firstString
WHEN @firstSpaceLoc > 0 THEN
@secondString + ', ' + @firstString
WHEN @firstSpaceLoc = 0 THEN
@firstString
END [Reported Name]
Expected results is that this goes through and separate every row in a column with multiple spaces to a long list of name that are separated. This list but a lot longer.
sql-server tsql
sql-server tsql
edited Mar 27 at 17:47
NeoAer
asked Mar 27 at 17:25
NeoAerNeoAer
758 bronze badges
758 bronze badges
Is another application calling this query/procedure? Or is this just meant to run inside of SQL-Server?
– Ryan Wilson
Mar 27 at 17:29
It is just meant to run in SQL server. No SP or applications
– NeoAer
Mar 27 at 17:30
Why do you think you need a loop? They are horribly inefficient.
– Sean Lange
Mar 27 at 17:37
Why not use STRING_SPLIT, then PIVOT your result?
– Robert Sievers
Mar 27 at 17:37
No the above code works just fine if copied into T-SQL as a standalone. The issue i'm having trying to figure out is how to loop this and capture each rows information.
– NeoAer
Mar 27 at 17:39
|
show 4 more comments
Is another application calling this query/procedure? Or is this just meant to run inside of SQL-Server?
– Ryan Wilson
Mar 27 at 17:29
It is just meant to run in SQL server. No SP or applications
– NeoAer
Mar 27 at 17:30
Why do you think you need a loop? They are horribly inefficient.
– Sean Lange
Mar 27 at 17:37
Why not use STRING_SPLIT, then PIVOT your result?
– Robert Sievers
Mar 27 at 17:37
No the above code works just fine if copied into T-SQL as a standalone. The issue i'm having trying to figure out is how to loop this and capture each rows information.
– NeoAer
Mar 27 at 17:39
Is another application calling this query/procedure? Or is this just meant to run inside of SQL-Server?
– Ryan Wilson
Mar 27 at 17:29
Is another application calling this query/procedure? Or is this just meant to run inside of SQL-Server?
– Ryan Wilson
Mar 27 at 17:29
It is just meant to run in SQL server. No SP or applications
– NeoAer
Mar 27 at 17:30
It is just meant to run in SQL server. No SP or applications
– NeoAer
Mar 27 at 17:30
Why do you think you need a loop? They are horribly inefficient.
– Sean Lange
Mar 27 at 17:37
Why do you think you need a loop? They are horribly inefficient.
– Sean Lange
Mar 27 at 17:37
Why not use STRING_SPLIT, then PIVOT your result?
– Robert Sievers
Mar 27 at 17:37
Why not use STRING_SPLIT, then PIVOT your result?
– Robert Sievers
Mar 27 at 17:37
No the above code works just fine if copied into T-SQL as a standalone. The issue i'm having trying to figure out is how to loop this and capture each rows information.
– NeoAer
Mar 27 at 17:39
No the above code works just fine if copied into T-SQL as a standalone. The issue i'm having trying to figure out is how to loop this and capture each rows information.
– NeoAer
Mar 27 at 17:39
|
show 4 more comments
3 Answers
3
active
oldest
votes
can you try this way:
DECLARE @nameString AS VARCHAR(MAX),
@firstString AS VARCHAR(MAX),
@secondString AS VARCHAR(MAX),
@thirdString AS VARCHAR(MAX)
SET @nameString = 'Robert Dobson, Jr.'
DECLARE @tbl TABLE
(
Id INT IDENTITY(1,1),
Name VARCHAR(MAX)
)
INSERT INTO @tbl(Name)
SELECT value FROM STRING_SPLIT(@nameString, ' ');
SELECT @firstString = Name FROM @tbl WHERE Id = 1
SELECT @secondString = Name FROM @tbl WHERE Id = 2
SELECT @thirdString = Name FROM @tbl WHERE Id = 3
SELECT
@nameString sourceString,
CASE WHEN LEN(@firstString) > 0 THEN 'There is one space'
ELSE 'There is not one space'
END [Is there one space],
CASE WHEN LEN(@secondString)> 0 THEN 'There is a second space'
ELSE 'There is not a second space'
END [Is there a second space],
CASE WHEN LEN(@thirdString)> 0 THEN 'There is a third space'
ELSE 'There is not a third space'
END [Is there a third space]
SELECT @nameString SourceString, @firstString [First string], @secondString [Second string] , @thirdString [Third string]
SELECT
CASE
WHEN LEN(@thirdString) > 0 THEN
@thirdString + ', ' + @firstString + ' ' + @secondString
WHEN LEN(@secondString) > 0 AND LEN(@thirdString) = 0 THEN
@secondString + ' ' + @thirdString + ', ' + @firstString
WHEN LEN(@firstString) > 0 THEN
@secondString + ', ' + @firstString
WHEN LEN(@firstString) = 0 THEN
@firstString
END [Reported Name]
add a comment |
Sorry if there is some bug in the code, I don't have access to MS-SQL now I've tried to coded directly here.
Your request is quite unusual (I agree with Robert's comment) , but a code simple like this would work.
DECLARE @nameString as varchar(max),
@firstString as varchar(max),
@secondString as varchar(max),
@thirdString as varchar(max)
SET @nameString = 'Robert Dobson, Jr.'
SET @thirdString = REPLACE(@nameString, ',', '')
SET @firstString = LTRIM(SUBSTRING(@thirdString, 1, CHARINDEX(' ', @thirdString)))
SET @thirdString = LTRIM(REPLACE(@thirdString, @firstString, ‘’))
SET @secondString = LTRIM(SUBSTRING(@thirdString, 1, CHARINDEX(' ', @thirdString)))
SET @thirdString = LTRIM(REPLACE(@thirdString, @secondString, ‘’))
SELECT
@nameString sourceString,
@firstString [First string],
@secondString [Second string],
@thirdString [Third string]
add a comment |
I am making the assumption that you need this to return a dynamic number of columns based on the number of spaces found in nameString. I am using a couple of things there that you will need on your system for this to work correctly.
First is a tally table. I keep one on my systems as a view. Here is the code that I use for this. A tally table is a great tool to help us avoid using loops. You can read more about them here.
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
The next thing we need is a string splitter. There are a number of these out there and even a built in one on recent versions of sql server. However, even the MS one misses a critical element of ordinal position for each element. Fortunately Jeff Moden has one that is set based, lightning fast and returns the position number of each element.
You can find the code for the DelimitedSplit8K here.
Now we face the challenge of returning a dynamic number of columns. For this you could use a dynamic pivot. That will work just fine. For me I find the syntax for pivot to very obtuse and prefer to use conditional aggregation, or crosstab. In this case it needs to be dynamic.
I created a temp table in my example to represent your table. I included some additional names to the list and some of them have more than 3 strings.
if OBJECT_ID('tempdb..#Something') is not null
drop table #Something
create table #Something --this represents your current table
(
nameString varchar(100)
)
insert #Something values
('Robert Dobson, Jr.')
, ('NeoAer')
, ('Ryan Wilson')
, ('Somebody with four names')
, ('another with yet more names')
declare @StaticPortion nvarchar(2000) =
'with OrderedResults as
(
select nameString
, stringValue = replace(x.Item, '','', '''')
, x.ItemNumber
from #Something s
cross apply dbo.DelimitedSplit8K(s.nameString, '' '') x
)
select nameString';
declare @DynamicPortion nvarchar(max) = '';
declare @FinalStaticPortion nvarchar(2000) = ' from OrderedResults Group by nameString order by nameString';
select @DynamicPortion = @DynamicPortion +
', MAX(Case when ItemNumber = ' + CAST(N as varchar(6)) + ' then stringValue end) as string' + CAST(N as varchar(6)) + CHAR(10)
from cteTally t
where t.N <=
(
select top 1 Count(*)
from #Something s
cross apply dbo.DelimitedSplit8K(s.nameString, ' ') x
group by nameString
order by COUNT(*) desc
)
select @StaticPortion + @DynamicPortion + @FinalStaticPortion
--once you are satisfied that the dynamic sql is correct uncomment the next two lines to execute it.
--declare @SqlToExecute nvarchar(max) = @StaticPortion + @DynamicPortion + @FinalStaticPortion;
--exec sp_executesql @SqlToExecute
If you don't this to return a dynamic number of columns we can employ a similar type of query but it far less complicated.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55383213%2fgrabbing-each-rows-data-and-setting-it-to-variable-tsql%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
can you try this way:
DECLARE @nameString AS VARCHAR(MAX),
@firstString AS VARCHAR(MAX),
@secondString AS VARCHAR(MAX),
@thirdString AS VARCHAR(MAX)
SET @nameString = 'Robert Dobson, Jr.'
DECLARE @tbl TABLE
(
Id INT IDENTITY(1,1),
Name VARCHAR(MAX)
)
INSERT INTO @tbl(Name)
SELECT value FROM STRING_SPLIT(@nameString, ' ');
SELECT @firstString = Name FROM @tbl WHERE Id = 1
SELECT @secondString = Name FROM @tbl WHERE Id = 2
SELECT @thirdString = Name FROM @tbl WHERE Id = 3
SELECT
@nameString sourceString,
CASE WHEN LEN(@firstString) > 0 THEN 'There is one space'
ELSE 'There is not one space'
END [Is there one space],
CASE WHEN LEN(@secondString)> 0 THEN 'There is a second space'
ELSE 'There is not a second space'
END [Is there a second space],
CASE WHEN LEN(@thirdString)> 0 THEN 'There is a third space'
ELSE 'There is not a third space'
END [Is there a third space]
SELECT @nameString SourceString, @firstString [First string], @secondString [Second string] , @thirdString [Third string]
SELECT
CASE
WHEN LEN(@thirdString) > 0 THEN
@thirdString + ', ' + @firstString + ' ' + @secondString
WHEN LEN(@secondString) > 0 AND LEN(@thirdString) = 0 THEN
@secondString + ' ' + @thirdString + ', ' + @firstString
WHEN LEN(@firstString) > 0 THEN
@secondString + ', ' + @firstString
WHEN LEN(@firstString) = 0 THEN
@firstString
END [Reported Name]
add a comment |
can you try this way:
DECLARE @nameString AS VARCHAR(MAX),
@firstString AS VARCHAR(MAX),
@secondString AS VARCHAR(MAX),
@thirdString AS VARCHAR(MAX)
SET @nameString = 'Robert Dobson, Jr.'
DECLARE @tbl TABLE
(
Id INT IDENTITY(1,1),
Name VARCHAR(MAX)
)
INSERT INTO @tbl(Name)
SELECT value FROM STRING_SPLIT(@nameString, ' ');
SELECT @firstString = Name FROM @tbl WHERE Id = 1
SELECT @secondString = Name FROM @tbl WHERE Id = 2
SELECT @thirdString = Name FROM @tbl WHERE Id = 3
SELECT
@nameString sourceString,
CASE WHEN LEN(@firstString) > 0 THEN 'There is one space'
ELSE 'There is not one space'
END [Is there one space],
CASE WHEN LEN(@secondString)> 0 THEN 'There is a second space'
ELSE 'There is not a second space'
END [Is there a second space],
CASE WHEN LEN(@thirdString)> 0 THEN 'There is a third space'
ELSE 'There is not a third space'
END [Is there a third space]
SELECT @nameString SourceString, @firstString [First string], @secondString [Second string] , @thirdString [Third string]
SELECT
CASE
WHEN LEN(@thirdString) > 0 THEN
@thirdString + ', ' + @firstString + ' ' + @secondString
WHEN LEN(@secondString) > 0 AND LEN(@thirdString) = 0 THEN
@secondString + ' ' + @thirdString + ', ' + @firstString
WHEN LEN(@firstString) > 0 THEN
@secondString + ', ' + @firstString
WHEN LEN(@firstString) = 0 THEN
@firstString
END [Reported Name]
add a comment |
can you try this way:
DECLARE @nameString AS VARCHAR(MAX),
@firstString AS VARCHAR(MAX),
@secondString AS VARCHAR(MAX),
@thirdString AS VARCHAR(MAX)
SET @nameString = 'Robert Dobson, Jr.'
DECLARE @tbl TABLE
(
Id INT IDENTITY(1,1),
Name VARCHAR(MAX)
)
INSERT INTO @tbl(Name)
SELECT value FROM STRING_SPLIT(@nameString, ' ');
SELECT @firstString = Name FROM @tbl WHERE Id = 1
SELECT @secondString = Name FROM @tbl WHERE Id = 2
SELECT @thirdString = Name FROM @tbl WHERE Id = 3
SELECT
@nameString sourceString,
CASE WHEN LEN(@firstString) > 0 THEN 'There is one space'
ELSE 'There is not one space'
END [Is there one space],
CASE WHEN LEN(@secondString)> 0 THEN 'There is a second space'
ELSE 'There is not a second space'
END [Is there a second space],
CASE WHEN LEN(@thirdString)> 0 THEN 'There is a third space'
ELSE 'There is not a third space'
END [Is there a third space]
SELECT @nameString SourceString, @firstString [First string], @secondString [Second string] , @thirdString [Third string]
SELECT
CASE
WHEN LEN(@thirdString) > 0 THEN
@thirdString + ', ' + @firstString + ' ' + @secondString
WHEN LEN(@secondString) > 0 AND LEN(@thirdString) = 0 THEN
@secondString + ' ' + @thirdString + ', ' + @firstString
WHEN LEN(@firstString) > 0 THEN
@secondString + ', ' + @firstString
WHEN LEN(@firstString) = 0 THEN
@firstString
END [Reported Name]
can you try this way:
DECLARE @nameString AS VARCHAR(MAX),
@firstString AS VARCHAR(MAX),
@secondString AS VARCHAR(MAX),
@thirdString AS VARCHAR(MAX)
SET @nameString = 'Robert Dobson, Jr.'
DECLARE @tbl TABLE
(
Id INT IDENTITY(1,1),
Name VARCHAR(MAX)
)
INSERT INTO @tbl(Name)
SELECT value FROM STRING_SPLIT(@nameString, ' ');
SELECT @firstString = Name FROM @tbl WHERE Id = 1
SELECT @secondString = Name FROM @tbl WHERE Id = 2
SELECT @thirdString = Name FROM @tbl WHERE Id = 3
SELECT
@nameString sourceString,
CASE WHEN LEN(@firstString) > 0 THEN 'There is one space'
ELSE 'There is not one space'
END [Is there one space],
CASE WHEN LEN(@secondString)> 0 THEN 'There is a second space'
ELSE 'There is not a second space'
END [Is there a second space],
CASE WHEN LEN(@thirdString)> 0 THEN 'There is a third space'
ELSE 'There is not a third space'
END [Is there a third space]
SELECT @nameString SourceString, @firstString [First string], @secondString [Second string] , @thirdString [Third string]
SELECT
CASE
WHEN LEN(@thirdString) > 0 THEN
@thirdString + ', ' + @firstString + ' ' + @secondString
WHEN LEN(@secondString) > 0 AND LEN(@thirdString) = 0 THEN
@secondString + ' ' + @thirdString + ', ' + @firstString
WHEN LEN(@firstString) > 0 THEN
@secondString + ', ' + @firstString
WHEN LEN(@firstString) = 0 THEN
@firstString
END [Reported Name]
answered Mar 27 at 17:38
Hasan MahmoodHasan Mahmood
9637 silver badges10 bronze badges
9637 silver badges10 bronze badges
add a comment |
add a comment |
Sorry if there is some bug in the code, I don't have access to MS-SQL now I've tried to coded directly here.
Your request is quite unusual (I agree with Robert's comment) , but a code simple like this would work.
DECLARE @nameString as varchar(max),
@firstString as varchar(max),
@secondString as varchar(max),
@thirdString as varchar(max)
SET @nameString = 'Robert Dobson, Jr.'
SET @thirdString = REPLACE(@nameString, ',', '')
SET @firstString = LTRIM(SUBSTRING(@thirdString, 1, CHARINDEX(' ', @thirdString)))
SET @thirdString = LTRIM(REPLACE(@thirdString, @firstString, ‘’))
SET @secondString = LTRIM(SUBSTRING(@thirdString, 1, CHARINDEX(' ', @thirdString)))
SET @thirdString = LTRIM(REPLACE(@thirdString, @secondString, ‘’))
SELECT
@nameString sourceString,
@firstString [First string],
@secondString [Second string],
@thirdString [Third string]
add a comment |
Sorry if there is some bug in the code, I don't have access to MS-SQL now I've tried to coded directly here.
Your request is quite unusual (I agree with Robert's comment) , but a code simple like this would work.
DECLARE @nameString as varchar(max),
@firstString as varchar(max),
@secondString as varchar(max),
@thirdString as varchar(max)
SET @nameString = 'Robert Dobson, Jr.'
SET @thirdString = REPLACE(@nameString, ',', '')
SET @firstString = LTRIM(SUBSTRING(@thirdString, 1, CHARINDEX(' ', @thirdString)))
SET @thirdString = LTRIM(REPLACE(@thirdString, @firstString, ‘’))
SET @secondString = LTRIM(SUBSTRING(@thirdString, 1, CHARINDEX(' ', @thirdString)))
SET @thirdString = LTRIM(REPLACE(@thirdString, @secondString, ‘’))
SELECT
@nameString sourceString,
@firstString [First string],
@secondString [Second string],
@thirdString [Third string]
add a comment |
Sorry if there is some bug in the code, I don't have access to MS-SQL now I've tried to coded directly here.
Your request is quite unusual (I agree with Robert's comment) , but a code simple like this would work.
DECLARE @nameString as varchar(max),
@firstString as varchar(max),
@secondString as varchar(max),
@thirdString as varchar(max)
SET @nameString = 'Robert Dobson, Jr.'
SET @thirdString = REPLACE(@nameString, ',', '')
SET @firstString = LTRIM(SUBSTRING(@thirdString, 1, CHARINDEX(' ', @thirdString)))
SET @thirdString = LTRIM(REPLACE(@thirdString, @firstString, ‘’))
SET @secondString = LTRIM(SUBSTRING(@thirdString, 1, CHARINDEX(' ', @thirdString)))
SET @thirdString = LTRIM(REPLACE(@thirdString, @secondString, ‘’))
SELECT
@nameString sourceString,
@firstString [First string],
@secondString [Second string],
@thirdString [Third string]
Sorry if there is some bug in the code, I don't have access to MS-SQL now I've tried to coded directly here.
Your request is quite unusual (I agree with Robert's comment) , but a code simple like this would work.
DECLARE @nameString as varchar(max),
@firstString as varchar(max),
@secondString as varchar(max),
@thirdString as varchar(max)
SET @nameString = 'Robert Dobson, Jr.'
SET @thirdString = REPLACE(@nameString, ',', '')
SET @firstString = LTRIM(SUBSTRING(@thirdString, 1, CHARINDEX(' ', @thirdString)))
SET @thirdString = LTRIM(REPLACE(@thirdString, @firstString, ‘’))
SET @secondString = LTRIM(SUBSTRING(@thirdString, 1, CHARINDEX(' ', @thirdString)))
SET @thirdString = LTRIM(REPLACE(@thirdString, @secondString, ‘’))
SELECT
@nameString sourceString,
@firstString [First string],
@secondString [Second string],
@thirdString [Third string]
answered Mar 27 at 18:16
fernolimitsfernolimits
12 bronze badges
12 bronze badges
add a comment |
add a comment |
I am making the assumption that you need this to return a dynamic number of columns based on the number of spaces found in nameString. I am using a couple of things there that you will need on your system for this to work correctly.
First is a tally table. I keep one on my systems as a view. Here is the code that I use for this. A tally table is a great tool to help us avoid using loops. You can read more about them here.
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
The next thing we need is a string splitter. There are a number of these out there and even a built in one on recent versions of sql server. However, even the MS one misses a critical element of ordinal position for each element. Fortunately Jeff Moden has one that is set based, lightning fast and returns the position number of each element.
You can find the code for the DelimitedSplit8K here.
Now we face the challenge of returning a dynamic number of columns. For this you could use a dynamic pivot. That will work just fine. For me I find the syntax for pivot to very obtuse and prefer to use conditional aggregation, or crosstab. In this case it needs to be dynamic.
I created a temp table in my example to represent your table. I included some additional names to the list and some of them have more than 3 strings.
if OBJECT_ID('tempdb..#Something') is not null
drop table #Something
create table #Something --this represents your current table
(
nameString varchar(100)
)
insert #Something values
('Robert Dobson, Jr.')
, ('NeoAer')
, ('Ryan Wilson')
, ('Somebody with four names')
, ('another with yet more names')
declare @StaticPortion nvarchar(2000) =
'with OrderedResults as
(
select nameString
, stringValue = replace(x.Item, '','', '''')
, x.ItemNumber
from #Something s
cross apply dbo.DelimitedSplit8K(s.nameString, '' '') x
)
select nameString';
declare @DynamicPortion nvarchar(max) = '';
declare @FinalStaticPortion nvarchar(2000) = ' from OrderedResults Group by nameString order by nameString';
select @DynamicPortion = @DynamicPortion +
', MAX(Case when ItemNumber = ' + CAST(N as varchar(6)) + ' then stringValue end) as string' + CAST(N as varchar(6)) + CHAR(10)
from cteTally t
where t.N <=
(
select top 1 Count(*)
from #Something s
cross apply dbo.DelimitedSplit8K(s.nameString, ' ') x
group by nameString
order by COUNT(*) desc
)
select @StaticPortion + @DynamicPortion + @FinalStaticPortion
--once you are satisfied that the dynamic sql is correct uncomment the next two lines to execute it.
--declare @SqlToExecute nvarchar(max) = @StaticPortion + @DynamicPortion + @FinalStaticPortion;
--exec sp_executesql @SqlToExecute
If you don't this to return a dynamic number of columns we can employ a similar type of query but it far less complicated.
add a comment |
I am making the assumption that you need this to return a dynamic number of columns based on the number of spaces found in nameString. I am using a couple of things there that you will need on your system for this to work correctly.
First is a tally table. I keep one on my systems as a view. Here is the code that I use for this. A tally table is a great tool to help us avoid using loops. You can read more about them here.
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
The next thing we need is a string splitter. There are a number of these out there and even a built in one on recent versions of sql server. However, even the MS one misses a critical element of ordinal position for each element. Fortunately Jeff Moden has one that is set based, lightning fast and returns the position number of each element.
You can find the code for the DelimitedSplit8K here.
Now we face the challenge of returning a dynamic number of columns. For this you could use a dynamic pivot. That will work just fine. For me I find the syntax for pivot to very obtuse and prefer to use conditional aggregation, or crosstab. In this case it needs to be dynamic.
I created a temp table in my example to represent your table. I included some additional names to the list and some of them have more than 3 strings.
if OBJECT_ID('tempdb..#Something') is not null
drop table #Something
create table #Something --this represents your current table
(
nameString varchar(100)
)
insert #Something values
('Robert Dobson, Jr.')
, ('NeoAer')
, ('Ryan Wilson')
, ('Somebody with four names')
, ('another with yet more names')
declare @StaticPortion nvarchar(2000) =
'with OrderedResults as
(
select nameString
, stringValue = replace(x.Item, '','', '''')
, x.ItemNumber
from #Something s
cross apply dbo.DelimitedSplit8K(s.nameString, '' '') x
)
select nameString';
declare @DynamicPortion nvarchar(max) = '';
declare @FinalStaticPortion nvarchar(2000) = ' from OrderedResults Group by nameString order by nameString';
select @DynamicPortion = @DynamicPortion +
', MAX(Case when ItemNumber = ' + CAST(N as varchar(6)) + ' then stringValue end) as string' + CAST(N as varchar(6)) + CHAR(10)
from cteTally t
where t.N <=
(
select top 1 Count(*)
from #Something s
cross apply dbo.DelimitedSplit8K(s.nameString, ' ') x
group by nameString
order by COUNT(*) desc
)
select @StaticPortion + @DynamicPortion + @FinalStaticPortion
--once you are satisfied that the dynamic sql is correct uncomment the next two lines to execute it.
--declare @SqlToExecute nvarchar(max) = @StaticPortion + @DynamicPortion + @FinalStaticPortion;
--exec sp_executesql @SqlToExecute
If you don't this to return a dynamic number of columns we can employ a similar type of query but it far less complicated.
add a comment |
I am making the assumption that you need this to return a dynamic number of columns based on the number of spaces found in nameString. I am using a couple of things there that you will need on your system for this to work correctly.
First is a tally table. I keep one on my systems as a view. Here is the code that I use for this. A tally table is a great tool to help us avoid using loops. You can read more about them here.
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
The next thing we need is a string splitter. There are a number of these out there and even a built in one on recent versions of sql server. However, even the MS one misses a critical element of ordinal position for each element. Fortunately Jeff Moden has one that is set based, lightning fast and returns the position number of each element.
You can find the code for the DelimitedSplit8K here.
Now we face the challenge of returning a dynamic number of columns. For this you could use a dynamic pivot. That will work just fine. For me I find the syntax for pivot to very obtuse and prefer to use conditional aggregation, or crosstab. In this case it needs to be dynamic.
I created a temp table in my example to represent your table. I included some additional names to the list and some of them have more than 3 strings.
if OBJECT_ID('tempdb..#Something') is not null
drop table #Something
create table #Something --this represents your current table
(
nameString varchar(100)
)
insert #Something values
('Robert Dobson, Jr.')
, ('NeoAer')
, ('Ryan Wilson')
, ('Somebody with four names')
, ('another with yet more names')
declare @StaticPortion nvarchar(2000) =
'with OrderedResults as
(
select nameString
, stringValue = replace(x.Item, '','', '''')
, x.ItemNumber
from #Something s
cross apply dbo.DelimitedSplit8K(s.nameString, '' '') x
)
select nameString';
declare @DynamicPortion nvarchar(max) = '';
declare @FinalStaticPortion nvarchar(2000) = ' from OrderedResults Group by nameString order by nameString';
select @DynamicPortion = @DynamicPortion +
', MAX(Case when ItemNumber = ' + CAST(N as varchar(6)) + ' then stringValue end) as string' + CAST(N as varchar(6)) + CHAR(10)
from cteTally t
where t.N <=
(
select top 1 Count(*)
from #Something s
cross apply dbo.DelimitedSplit8K(s.nameString, ' ') x
group by nameString
order by COUNT(*) desc
)
select @StaticPortion + @DynamicPortion + @FinalStaticPortion
--once you are satisfied that the dynamic sql is correct uncomment the next two lines to execute it.
--declare @SqlToExecute nvarchar(max) = @StaticPortion + @DynamicPortion + @FinalStaticPortion;
--exec sp_executesql @SqlToExecute
If you don't this to return a dynamic number of columns we can employ a similar type of query but it far less complicated.
I am making the assumption that you need this to return a dynamic number of columns based on the number of spaces found in nameString. I am using a couple of things there that you will need on your system for this to work correctly.
First is a tally table. I keep one on my systems as a view. Here is the code that I use for this. A tally table is a great tool to help us avoid using loops. You can read more about them here.
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
The next thing we need is a string splitter. There are a number of these out there and even a built in one on recent versions of sql server. However, even the MS one misses a critical element of ordinal position for each element. Fortunately Jeff Moden has one that is set based, lightning fast and returns the position number of each element.
You can find the code for the DelimitedSplit8K here.
Now we face the challenge of returning a dynamic number of columns. For this you could use a dynamic pivot. That will work just fine. For me I find the syntax for pivot to very obtuse and prefer to use conditional aggregation, or crosstab. In this case it needs to be dynamic.
I created a temp table in my example to represent your table. I included some additional names to the list and some of them have more than 3 strings.
if OBJECT_ID('tempdb..#Something') is not null
drop table #Something
create table #Something --this represents your current table
(
nameString varchar(100)
)
insert #Something values
('Robert Dobson, Jr.')
, ('NeoAer')
, ('Ryan Wilson')
, ('Somebody with four names')
, ('another with yet more names')
declare @StaticPortion nvarchar(2000) =
'with OrderedResults as
(
select nameString
, stringValue = replace(x.Item, '','', '''')
, x.ItemNumber
from #Something s
cross apply dbo.DelimitedSplit8K(s.nameString, '' '') x
)
select nameString';
declare @DynamicPortion nvarchar(max) = '';
declare @FinalStaticPortion nvarchar(2000) = ' from OrderedResults Group by nameString order by nameString';
select @DynamicPortion = @DynamicPortion +
', MAX(Case when ItemNumber = ' + CAST(N as varchar(6)) + ' then stringValue end) as string' + CAST(N as varchar(6)) + CHAR(10)
from cteTally t
where t.N <=
(
select top 1 Count(*)
from #Something s
cross apply dbo.DelimitedSplit8K(s.nameString, ' ') x
group by nameString
order by COUNT(*) desc
)
select @StaticPortion + @DynamicPortion + @FinalStaticPortion
--once you are satisfied that the dynamic sql is correct uncomment the next two lines to execute it.
--declare @SqlToExecute nvarchar(max) = @StaticPortion + @DynamicPortion + @FinalStaticPortion;
--exec sp_executesql @SqlToExecute
If you don't this to return a dynamic number of columns we can employ a similar type of query but it far less complicated.
answered Mar 27 at 18:34
Sean LangeSean Lange
27.4k2 gold badges20 silver badges35 bronze badges
27.4k2 gold badges20 silver badges35 bronze badges
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55383213%2fgrabbing-each-rows-data-and-setting-it-to-variable-tsql%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Is another application calling this query/procedure? Or is this just meant to run inside of SQL-Server?
– Ryan Wilson
Mar 27 at 17:29
It is just meant to run in SQL server. No SP or applications
– NeoAer
Mar 27 at 17:30
Why do you think you need a loop? They are horribly inefficient.
– Sean Lange
Mar 27 at 17:37
Why not use STRING_SPLIT, then PIVOT your result?
– Robert Sievers
Mar 27 at 17:37
No the above code works just fine if copied into T-SQL as a standalone. The issue i'm having trying to figure out is how to loop this and capture each rows information.
– NeoAer
Mar 27 at 17:39