Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
Gorovdude23
Starting Member
4 Posts |
Posted - 2012-07-11 : 10:06:55
|
Hello,I am new to SQL and I have a table that i need to add 200k records to it.There are 2 Columns in the table, one for ID (INT) and one for UserName (VARCHAR(255)).The ID Column values begins with 100 and running untill the last record (end with 200099)The UserName Column values are combination of pstring prefix ("user") and a number (starts with 0 and increasing)Here is the SQL Stred Procedure that I wrote for it, i mange to run it but nothing happns...Can someone please assist? Thanks, gorovDudeCREATE PROCEDURE test AS BEGINDECLARE @ind INTSET @ind = 100DECLARE @ind2 INTSET @ind2 = 0DECLARE @v_query VARCHAR(255)DECLARE @str VARCHAR(255)DECLARE @str2 VARCHAR(255)DECLARE @TableName VARCHAR(255)BEGINWHILE (@ind <=10)SET @str = CAST(@ind as varchar(255))SET @str2 = CAST(@ind2 as varchar(255))SET @TableName = 'dbo.TEMP'SET @v_query = 'INSERT INTO ' + @TableName + 'VALUES ( ' + @str + ' , ''user' + @str2 + ''')' ;EXEC (@v_query)SET @ind = @ind + 1;SET @ind2 = @ind2 + 1;ENDENDGO Here is how I Run the Store ProcedureEXECUTE test |
|
sunitabeck
Master Smack Fu Yak Hacker
5155 Posts |
Posted - 2012-07-11 : 10:29:31
|
Your while loop will be effective only for the next line in your code unless you use a BEGIN/END pair. So change would need to do something like this:WHILE (@ind <=10)BEGINSET @str = CAST(@ind as varchar(255))SET @str2 = CAST(@ind2 as varchar(255))SET @TableName = 'dbo.TEMP'SET @v_query = 'INSERT INTO ' + @TableName + 'VALUES ( ' + @str + ' , ''user' + @str2 + ''')' ;EXEC (@v_query)SET @ind = @ind + 1;SET @ind2 = @ind2 + 1;END But, that is likely to be a slow operation. Do something like this using a numbers table.-- Create a numbers table.CREATE TABLE #N(n INT NOT NULL PRIMARY KEY CLUSTERED );;WITH N(n) AS(SELECT 1 UNION ALL SELECT n+1 FROM N WHERE n < 200000)INSERT INTO #N SELECT n FROM N OPTION (MAXRECURSION 0);-- use the numbers table to populate the TempValues table.INSERT INTO dbo.TempValuesSELECT n+99, 'user' + CAST(n-1 AS VARCHAR(32))FROM #N; -- Delete numbers table.DROP TABLE #N; |
 |
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2012-07-11 : 11:30:53
|
cant understand need of dynamic sql hereAlso why not make ID a identity column with seed as 100 and make userName computed column based on it?------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
 |
|
Gorovdude23
Starting Member
4 Posts |
Posted - 2012-07-12 : 01:52:54
|
Thanks sunitabeck and visakh16@visakh16 > The table is given and i am not able / allowed to change it.As for the solution by @sunitabeck, I found it very usable and i changed it a bit to meet my exact needs / existing table configuration and here is how it currently look like-- Create a numbers table.CREATE TABLE #N(n INT NOT NULL PRIMARY KEY CLUSTERED );;WITH N(n) AS(SELECT 1 UNION ALL SELECT n+1 FROM N WHERE n < 149999)INSERT INTO #N SELECT n FROM N OPTION (MAXRECURSION 0);-- use the numbers table to populate the TempUsersCreation table.INSERT INTO dbo.TempUsersCreationSELECT n ,'NULL' ,'NULL' ,'NULL' ,'NULL' ,'NULL' ,'Person' ,'NULL' ,'NULL' ,'ffuser' + CAST(n-1 AS VARCHAR(32)) ,n+99FROM #N; -- Delete numbers table.DROP TABLE #N; As you can see the table that i need to populate has 11 Columns (I asked about the way to deal with 2 specific columns in the previous message). Now when i want to use these Queries to fill it, I need to know how to populate special Columns (Example - the Cross Reference ID is a Auto number column)When I try to run the "INSERT INTO" Query, I get an Error (not supprisig) of:Msg 241, Level 16, State 1, Line 1Conversion failed when converting date and/or time from character string.If you need the exact defenition of the TempUsersCreation Table, here it is:Column Name Data Type Allow Nulls[Cross Reference ID] int Unchecked[Created By] nvarchar(50) Checked[Creation Date] datetime Checked[Modified By] nvarchar(50) Checked[Modification Date] datetime Checked[Row Status] nvarchar(15) CheckedObject nvarchar(15) Checked[External System] nvarchar(15) Checked[External ID] bigint Checked[External Key] nvarchar(50) Checked[Analytic ID] int Checked Thanks Once Again,GorovDude |
 |
|
sunitabeck
Master Smack Fu Yak Hacker
5155 Posts |
Posted - 2012-07-12 : 06:57:46
|
Remove the single quotes around the NULLs in the select list:INSERT INTO dbo.TempUsersCreationSELECT n ,NULL ,NULL ,NULL ,NULL ,NULL ,'Person' ,NULL ,NULL ,'ffuser' + CAST(n-1 AS VARCHAR(32)) ,n+99FROM #N; If you want to insert a NULL, it should be listed without the quotes. When you list it with quotes, you are inserting the string NULL rather than a NULL value. |
 |
|
Gorovdude23
Starting Member
4 Posts |
Posted - 2012-07-12 : 08:05:20
|
Works like Magic. Thanks! One more Question / Request:In the Numbers Table I have numbers between 0 and 212,399There are 4 string prefix that I need to use:AAA for numbers between 0 - 149,999BBB for numbers between 150,000 - 209,999CCC for numbers between 210,000 - 211,799DDD for numbers between 211,800 - 212,399How can I add it to the Query?Thanks! |
 |
|
sunitabeck
Master Smack Fu Yak Hacker
5155 Posts |
Posted - 2012-07-12 : 09:49:29
|
You can use a case expression. Something like this:CASE WHEN n <= 149999 THEN 'AAA' WHEN n <= 209999 THEN 'BBB' WHEN n <= 211799 THEN 'CCC' WHEN n <= 212399 THEN 'DDD' ELSE ''END + CAST(n-1 AS VARCHAR(32)) -- if you need to append n |
 |
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2012-07-12 : 10:10:10
|
quote: Originally posted by Gorovdude23 Works like Magic. Thanks! One more Question / Request:In the Numbers Table I have numbers between 0 and 212,399There are 4 string prefix that I need to use:AAA for numbers between 0 - 149,999BBB for numbers between 150,000 - 209,999CCC for numbers between 210,000 - 211,799DDD for numbers between 211,800 - 212,399How can I add it to the Query?Thanks!
Use a CASE...WHEN statement if its one time calculationlike..CASE WHEN number BETWEEN 0 AND 149999 THEN 'AAA' WHEN number BETWEEN 150000 AND 209999 THEN 'BBB'...END AS YourNewColumnName for a more scalable and maintainable long term solution add a mapping table likeNumberRanges--------------RangeDesc StartValue EndValue----------------------------------------------AAA 0 149999BBB 150000 209999...and use a join in your query likeJOIN NumberRanges nrON yourtable.Numbers BETWEEN nr.StartValue AND nr.EndValue... ------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
 |
|
|
|
|
|
|