Solved

sql function needed for csv list of fields

Posted on 2013-06-13
9
238 Views
Last Modified: 2013-06-21
Hi All, This is legacy stuff that I have to make work.  I need a function to return a comma separated list of field names for each record.  Let's pretend this is the scenario.

--DROP TABLE tempdb.dbo.mh_account_change_requests

CREATE TABLE tempdb.dbo.mh_account_change_requests (
acr_id INT NOT NULL,
acr_fname VARCHAR(255) NULL,
acr_fname_change BIT NOT NULL,
acr_mname VARCHAR(255) NULL,
acr_mname_change BIT NOT NULL,
acr_lname VARCHAR(255) NULL,
acr_lname_change BIT NOT NULL)

INSERT INTO tempdb.dbo.mh_account_change_requests VALUES (1, 'Greg', 1, NULL, 0, 'Brady', 1)
INSERT INTO tempdb.dbo.mh_account_change_requests VALUES (2, NULL, 0, 'Pete', 1, 'Brady', 1)
INSERT INTO tempdb.dbo.mh_account_change_requests VALUES (3, 'Bobby', 1, 'Brady', 1, NULL, 0)

SELECT *, <plus a comma separated list OF the change field NAME> AS changerequests FROM tempdb.dbo.mh_account_change_requests

For results that look like this:
desired results
0
Comment
Question by:MariaHalt
  • 3
  • 3
  • 2
  • +1
9 Comments
 
LVL 6

Expert Comment

by:BurundiLapp
ID: 39245039
0
 

Author Comment

by:MariaHalt
ID: 39245060
I only want the fields where the bit = 1.
0
 

Author Comment

by:MariaHalt
ID: 39245064
Also, I don't want to export them to a file, I just need the results in an additional field.
0
 
LVL 6

Expert Comment

by:BurundiLapp
ID: 39245124
I experienced an error whilst testing this, it wouldn't let me create a row of column names and then union that with a full select from the table as some of the fields where set to 'int' and the column names weren't integers.

My code was:
select 'Code','Description','Address1','Address2','Address3','Address4','Postcode','Tel'

union

select * from branches

Open in new window


And I got the error:

Conversion failed when converting the varchar value 'Code' to data type int.

Open in new window


However if you were to cast or convert each integer field to nchar in your main select statement it may work!
0
Backup Your Microsoft Windows Server®

Backup all your Microsoft Windows Server – on-premises, in remote locations, in private and hybrid clouds. Your entire Windows Server will be backed up in one easy step with patented, block-level disk imaging. We achieve RTOs (recovery time objectives) as low as 15 seconds.

 
LVL 23

Expert Comment

by:nemws1
ID: 39245155
First off, that you so much for providing some sample SQL code.  It is so very helpful!!!

I'm thinking you want to use STUFF along with XML PATH.  (This is basically the same as MySQL's GROUP_CONCAT function), but usually that means grouping by something (a key?)

In your example code, what is the comma seperated list that you're looking for/results that you want?

You most likely want something using this code - I'm just trying to figure out what it is you exactly want.

SELECT STUFF(
             (SELECT ',' + Column_Name 
              FROM Table_Name
              FOR XML PATH (','))
             , 1, 1, '')

Open in new window

0
 
LVL 23

Expert Comment

by:nemws1
ID: 39245160
BurundiLapp - I think you posted this to wrong thread question.
0
 
LVL 6

Expert Comment

by:BurundiLapp
ID: 39245165
I think I may have, sorry OP.
0
 
LVL 4

Accepted Solution

by:
BAKADY earned 500 total points
ID: 39245572
SELECT *,
  STUFF((
    SELECT ', ' + COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'mh_account_change_requests'
       AND (
          (COLUMN_NAME = 'acr_fname' AND Not acr_fname Is NULL)
         OR
          (COLUMN_NAME = 'acr_mname' AND Not acr_mname Is NULL)
         OR
          (COLUMN_NAME = 'acr_lname' AND Not acr_lname Is NULL)
         )
    ORDER BY ordinal_position
    FOR XML PATH('')
  ),1,2,'')
FROM mh_account_change_requests

Open in new window


to try the code above look by SQL-Fiddle

http://sqlfiddle.com/#!3/a88e3/3
0
 

Author Closing Comment

by:MariaHalt
ID: 39266285
Beyond Excellent!  Thank you!!! Exactly what I wanted.
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Introduction In my previous article (http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/SSIS/A_9150-Loading-XML-Using-SSIS.html) I showed you how the XML Source component can be used to load XML files into a SQL Server database, us…
Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
Using examples as well as descriptions, and references to Books Online, show the documentation available for datatypes, explain the available data types and show how data can be passed into and out of variables.
Viewers will learn how to use the SELECT statement in SQL to return specific rows and columns, with various degrees of sorting and limits in place.

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now