July 7, 2008 at 1:00 am
Hi,
I have a table that contains one column with nvarchar. Let's say this is the table:
Reasons_T -----------
| Reason |
-----------
| xxx |
| yyy |
| zzz |
now I want to dynamically create a new table that has 1 column for each row in the previous table. meaning:
Summary_T
-----------
| xxx | yyy | zzz |
-----------------
| | | |
| | | |
| | | |
I used the following cursor but I'm getting a syntax error (for the bolded row below):
--create the Table
CREATE TABLE Summary_T
--Add the columns
DECLARE @Reason nvarchar(10)
DECLARE cr cursor local for
SELECT DISTINCT [Reason]
FROM Reason_T
open cr
fetch next from cr into @Reason
while @@fetch_status=0
begin
--**********************************************************
ALTER TABLE Summary_T
ADD @Reason int
**********************************************************
fetch next from cr into @Reason
end
close cr
deallocate cr
will love for your inputs of what am I doing wrong...
thanks!:)
July 7, 2008 at 1:11 am
You can't use variables within an alter table statement. You're going to need dynamic SQL for this.
DECLARE @Reason nvarchar(10), @sSQL NVARCHAR(500)
DECLARE cr cursor local FAST_FORWARD for
SELECT DISTINCT [Reason]
FROM Reason_T
open cr
fetch next from cr into @Reason
while @@fetch_status=0
begin
SET @sSQL = 'ALTER TABLE Summary_T ADD ' + @Reason + ' int'
EXEC @sSQL
fetch next from cr into @Reason
end
close cr
deallocate cr
I'm curious. What are you trying to achieve here?
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
July 7, 2008 at 1:19 am
Hi,
First - thanks alot for this quick response!
The reasons table is dynamic (we add reasons once in a while) and I'm making a summary of this into a report. the report will count how many times each Reason was selected for a certain Employee. (the Summary table contains also Employee ID column)
I got this error:
'ALTER TABLE Summary_T ADD [Dep - HC request] int' is not a valid identifier
Do you know what might be the problem?
thanks!:)
July 7, 2008 at 1:24 am
I think the [ ] were the problem... when I removed it from the reasons table I got the following error for each of the rows in the reasons table....:
Could not find stored procedure 'ALTER TABLE ResSum ADD Dep-HCrequest int'.
July 7, 2008 at 4:01 am
Sorry, my mistake. The exec line should have been.
EXEC (@sSQL)
Note the brackets.
The reasons table is dynamic (we add reasons once in a while) and I'm making a summary of this into a report. the report will count how many times each Reason was selected for a certain Employee. (the Summary table contains also Employee ID column)
Hmm. Take a look at the PIVOT keyword in SQL 2005. It's possible you may be able to use that instead of building a dynamic table.
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
July 8, 2008 at 7:49 am
I think GilaMonster is right in that this additional table seems unnecessary. Why not create a view with the summarized fields (using a pivot)?
August 6, 2018 at 11:36 am
I have a requirement to build a sql statement that will dynamic pass the tablename and 2 columns names. I have a result table that that has this information. the table and column name along with the assetid I should be able to iterate through my table and return a field value for each row item, which I will need to join to my results table later. I am not familiar with cursor and believe I will need to go this route to retrieve my results. The three parameters I have to get my results are
TableName - dynamic
FieldName (or columnname in table) - dynamic
AssetId (same columnname in all tables)
any help on how too start would be appreciated
thanks
Viewing 7 posts - 1 through 6 (of 6 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy