此执行给出了以下错误:
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'go'.
Msg 111, Level 15, State 1, Line 11
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.
如果我删除“GO”,它只给我第二个。
我缺少什么提示?
declare @dbname varchar(500)
set @dbname='master'
Exec ('
Use ' + @dbname + '
go
create PROCEDURE [dbo].[krijo_database] @dbname nvarchar(2000), @Direktoria varchar(4000)
AS
BEGIN
declare @stringu nvarchar(100)
set @stringu =
''CREATE DATABASE '' + @dbname
exec (@stringu)
End
')
答案
declare @dbname varchar(500)
set @dbname='kontabel'
Exec(
'Use ' + @dbname +'
Exec (''
create PROCEDURE [dbo].[krijo_database] @dbname nvarchar(2000), @Direktoria varchar(4000)
AS
BEGIN
declare @stringu nvarchar(100)
set @stringu =
''''create DATABASE '''' + @dbname
exec (@stringu)
End
'')
')
实际上我尝试过这样做但它有效,但我不得不改变引号。 我想要使用的真正程序超过50000行,我无法手动将引号更改为所有内容。
有更好的方法吗?
答案 0 :(得分:2)
两个问题:
使用“GO”是不正确的...没有名为“GO”的SQL关键字...... 这只是SQL Server Management Studio正在为您执行的黑客攻击。
您需要在其自己的上下文中使用CREATE PROCEDURE命令...简单。
以下是对您的脚本的轻微修改:
declare @dbname varchar(500)
set @dbname='master'
Exec ('
Use ' + @dbname + '
EXECUTE(''create PROCEDURE [dbo].[krijo_database] @dbname nvarchar(2000), @Direktoria varchar(4000)
AS
BEGIN
declare @stringu nvarchar(100)
set @stringu =
''''CREATE DATABASE '''' + @dbname
exec (@stringu)
End'')
')
所以答案是在第一个EXECUTE命令中放入另一个“EXECUTE”命令 。我一直这样做,很多次都在“sp_msforeachdb”中。只要你愿意,你就可以为那些坏男孩筑巢。
答案 1 :(得分:1)
前段时间我的代码是根据脚本更新数据库结构。 我最后用'go'分割文件并分别执行每个片段。你能试试吗?
所以,首先是exec use语句,而不是exec createprocedure。
请务必验证它是否在适当的数据库中创建
答案 2 :(得分:0)
我的错误,我没注意到什么。
也许是Exec中的Exec导致了错误?
或者因为你将nvarchar(2000)分配给nvarchar(100)
“消息102,级别15,状态1,行5”'go'附近的语法不正确。消息111,级别15,状态1,行11'创建/更改过程'必须是查询批处理中的第一个语句。“如果我删除“GO”,它只给我第二个。
在没有任何use
或go
:create PROCEDURE '+@dbname+'.[dbo].[krijo_database] @dbname nvarchar(2000)
答案 3 :(得分:0)
你不能像那样使用GO
如果你删除它,那么你会得到“批处理中的第一个”错误
在这种情况下,为什么不这样做......
Use master
GO
create PROCEDURE [dbo].[krijo_database] @dbname nvarchar(2000), @Direktoria varchar(4000)
AS
BEGIN
declare @stringu nvarchar(100)
set @stringu = 'CREATE DATABASE ' + @dbname
exec (@stringu)
End
GO
为什么需要动态SQL来创建存储过程?
答案 4 :(得分:0)
USE master
GO
CREATE PROCEDURE dbo.create_database @name nvarchar(100)
AS
DECLARE @sql nvarchar(100)
SET @sql = 'CREATE DATABASE ' + QUOTENAME(@name)
EXEC (@sql)
GO
答案 5 :(得分:0)
我想使用它的真实程序是一个非常大的,更多的50000行,我不能继续改变所有的报价
Microsoft SQL Server的最大varchar长度为8000个字符。
http://www.databasejournal.com/features/mssql/article.php/3788256/Data-Types-in-SQL-Server-2008.htm
答案 6 :(得分:0)
你所追求的是我不能想到的。
请参阅this article以获取参考资料
答案 7 :(得分:0)
您应该使用带变量的部分创建存储过程。
答案 8 :(得分:0)
我用过SQl DMO! 适用于32位和64位的强大功能,兼容SQL Express和服务器!