September 8, 2008 at 9:09 am
hey guys i'm trying to use the following script to create a database but getting error
(Msg 102, Level 15, State 1, Line 18
Incorrect syntax near '
ON (NAME =''.
)
.
declare @name nvarchar(200)
declare @month nvarchar(100)
declare @year nvarchar(100)
declare @filename nvarchar(900)
set @filename = N'D:\Data\'+@name+ '_Data.MDF'
set @month = month(convert(nvarchar(16),getdate(),112))
set @year = year(convert(nvarchar(16),getdate()))
set @name = N'Weblog'+@year+@month
--print @name
print @filename
-- This step will take at least 10 minutes.
declare @cmd varchar(4000)
set @cmd = 'CREATE DATABASE '+@name'
ON (NAME ='''+@name+'_Data'''',
FILENAME = ''D:\Data\'+@name +'_Data.MDF'',
SIZE = 10000,
FILEGROWTH = 10%)
LOG ON (NAME = '@name+'_Log','
FILENAME = ''D:\Data\'+@name +'_Log.LDF'' ,''
SIZE = 10,
FILEGROWTH = 10%)
COLLATE SQL_Latin1_General_CP1_CI_AS
GO
'
exec (@cmd)
appreciate all the help thanks
September 8, 2008 at 9:15 am
I believe the problem is caused by @name being inside the double quotes so SQL server is seeing @name instead of the value you intended to pass.
Try closing the double quotes before the @name and reopening them after.
For best practices on asking questions, please read the following article: Forum Etiquette: How to post data/code on a forum to get the best help[/url]
September 8, 2008 at 9:24 am
Several syntacs mistakes:
declare @name nvarchar(200)
declare @month nvarchar(100)
declare @year nvarchar(100)
declare @filename nvarchar(900)
set @filename = N'D:\Data\'+@name+ '_Data.MDF'
set @month = month(convert(nvarchar(16),getdate(),112))
set @year = year(convert(nvarchar(16),getdate()))
set @name = N'Weblog'+@year+@month
--print @name
print @filename
-- This step will take at least 10 minutes.
declare @cmd varchar(4000)
set @cmd = 'CREATE DATABASE '+ @name + '
ON (NAME ='''+@name+'_Data'',
FILENAME = ''D:\Data\'+@name +'_Data.MDF'',
SIZE = 10000,
FILEGROWTH = 10%)
LOG ON (NAME = '+ @name+'_Log'',
FILENAME = ''D:\Data\'+@name +'_Log.LDF'' ,''
SIZE = 10,
FILEGROWTH = 10%)
COLLATE SQL_Latin1_General_CP1_CI_AS
GO
'
exec (@cmd)
September 8, 2008 at 9:24 am
ok, did that but still getting the same error
September 8, 2008 at 9:27 am
You had some issues with your single quotes ('). try the following code:
declare @name nvarchar(200)
declare @month nvarchar(100)
declare @year nvarchar(100)
declare @filename nvarchar(900)
set @filename = N'D:\Data\'+@name+ '_Data.MDF'
set @month = month(convert(nvarchar(16),getdate(),112))
set @year = year(convert(nvarchar(16),getdate()))
set @name = N'Weblog'+@year+@month
--print @name
print @filename
-- This step will take at least 10 minutes.
declare @cmd varchar(4000)
set @cmd = 'CREATE DATABASE '+@name + '
ON (NAME ='''+@name+'_Data'''',
FILENAME = ''D:\Data\'+@name +'_Data.MDF'',
SIZE = 10000,
FILEGROWTH = 10%)
LOG ON (NAME = ' + @name + '_Log,
FILENAME = ''D:\Data\'+ @name + '_Log.LDF'' ,''
SIZE = 10,
FILEGROWTH = 10%)
COLLATE SQL_Latin1_General_CP1_CI_AS
'
--exec (@cmd)
print @cmd;
September 8, 2008 at 9:28 am
There's at least to more places where @name is used and you should make the changes there too.
For best practices on asking questions, please read the following article: Forum Etiquette: How to post data/code on a forum to get the best help[/url]
September 8, 2008 at 9:29 am
I found one more error when I rechecked my code. Try this:
declare @name nvarchar(200)
declare @month nvarchar(100)
declare @year nvarchar(100)
declare @filename nvarchar(900)
set @filename = N'D:\Data\'+@name+ '_Data.MDF'
set @month = month(convert(nvarchar(16),getdate(),112))
set @year = year(convert(nvarchar(16),getdate()))
set @name = N'Weblog'+@year+@month
--print @name
print @filename
-- This step will take at least 10 minutes.
declare @cmd varchar(4000)
set @cmd = 'CREATE DATABASE '+@name + '
ON (NAME ='''+@name+'_Data'''',
FILENAME = ''D:\Data\'+@name +'_Data.MDF'',
SIZE = 10000,
FILEGROWTH = 10%)
LOG ON (NAME = ' + @name + '_Log,
FILENAME = ''D:\Data\'+ @name + '_Log.LDF'' ,
SIZE = 10,
FILEGROWTH = 10%)
COLLATE SQL_Latin1_General_CP1_CI_AS
'
--exec (@cmd)
print @cmd;
September 8, 2008 at 9:33 am
i got the following:
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'D:'.
Msg 132, Level 15, State 1, Line 7
The label 'D' has already been declared. Label names must be unique within a query batch or stored procedure.
Msg 105, Level 15, State 1, Line 7
Unclosed quotation mark after the character string ' ,
SIZE = 10,
FILEGROWTH = 10%)
COLLATE SQL_Latin1_General_CP1_CI_AS
'.
September 8, 2008 at 9:38 am
Ok i got it down to the following error:
Msg 153, Level 15, State 1, Line 6
Invalid usage of the option Weblog20089_Log in the CREATE/ALTER DATABASE statement.
any idea wut this could be?
September 8, 2008 at 9:40 am
Okay, one last try. I found another place that required a change. I also copied the generated sql to a seperate window in SSMS and checked the syntax, and this looks good:
declare @filename nvarchar(900)
set @filename = N'D:\Data\'+@name+ '_Data.MDF'
set @month = month(convert(nvarchar(16),getdate(),112))
set @year = year(convert(nvarchar(16),getdate()))
set @name = N'Weblog'+@year+@month
--print @name
print @filename
-- This step will take at least 10 minutes.
declare @cmd varchar(4000)
set @cmd = 'CREATE DATABASE '+@name + '
ON (NAME ='''+@name+'_Data'',
FILENAME = ''D:\Data\'+@name +'_Data.MDF'',
SIZE = 10000,
FILEGROWTH = 10%)
LOG ON (NAME = ' + @name + '_Log,
FILENAME = ''D:\Data\'+ @name + '_Log.LDF'' ,
SIZE = 10,
FILEGROWTH = 10%)
COLLATE SQL_Latin1_General_CP1_CI_AS
'
--exec (@cmd)
print @cmd;
September 8, 2008 at 9:41 am
Sorry. Here is the final version:
You have to make sure that the folder d:\Data exists.
declare @name nvarchar(200)
declare @month nvarchar(100)
declare @year nvarchar(100)
declare @filename nvarchar(900)
set @filename = N'D:\Data\'+@name+ '_Data.MDF'
set @month = month(convert(nvarchar(16),getdate(),112))
set @year = year(convert(nvarchar(16),getdate()))
set @name = N'Weblog'+@year+@month
--print @name
print @filename
-- This step will take at least 10 minutes.
declare @cmd varchar(4000)
set @cmd = 'CREATE DATABASE '+ @name + '
ON (NAME ='+@name+'_Data' + ',
FILENAME = ''D:\Data\'+@name +'_Data.MDF'',
SIZE = 10000,
FILEGROWTH = 10%)
LOG ON (NAME = '+ @name+'_Log' + ',
FILENAME = ''D:\Data\'+@name +'_Log.LDF'' ,
SIZE = 10,
FILEGROWTH = 10%)
COLLATE SQL_Latin1_General_CP1_CI_AS
'
exec (@cmd)
September 8, 2008 at 9:44 am
ok thts it. thanks
September 8, 2008 at 9:47 am
The first problem is on this line
set @cmd = 'CREATE DATABASE '+@name'
You have a single quote after the identifier but you need an operator so change it to
set @cmd = 'CREATE DATABASE ' +@name + '
Then you will receive the same type of error message for the line
LOG ON (NAME = '@name+'_Log','
where you have the same type of problem.
I recommend that you change you add a print (@cmd) and just walk through the dynamic string generation a line at a time. You will need a combination of one, two and sometimes three single quotes to get the syntax of the generated string correct.
You always have to have a concatenation operator to join substrings.
You always have to have two single ticks in the string to get one in the output string (I sometimes thnink of them meta-ticks).
It sometimes help to think of each line of the clause as a separate substring.
So
declare @CrLfchar(2)
set @CrLf = Char(13) + Char(10)
Set @Cmd = 'Create Database ' + @Name + @CrLf
+ ' On (Name = '' ' + @Name + '_Dat ' + @CrLf
+ ', FileName = D:\Data\' + @Name + '_Data.mdf' + @CrLf
+ ', Size = 10000' + @CrLf
+ ', FileGrowth = 10%) ' + @CrLf
+ ''''
Print @cmd
The @CrLf just makes the string more readable while you build it up.
The last line is 4 single quotes that closes off the command string for you.
I have always found that I have to build these up one clause at a time and in a very rigoursly formatted manner. Otherwise it takes me a long time to debug them.
Also this format makes it easy to comment out single parameters when you actually start debugging the generated script
The joy of Dynamic SQL
Enjoy
September 8, 2008 at 11:51 am
Thanks Ray,
the above definitely helps
Viewing 14 posts - 1 through 13 (of 13 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