动态使用数据库

时间:2010-04-14 09:02:44

标签: sql-server-2005 tsql

此执行给出了以下错误:

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行,我无法手动将引号更改为所有内容。

有更好的方法吗?

9 个答案:

答案 0 :(得分:2)

两个问题:

  1. 使用“GO”是不正确的...没有名为“GO”的SQL关键字...... 这只是SQL Server Management Studio正在为您执行的黑客攻击。

  2. 您需要在其自己的上下文中使用CREATE PROCEDURE命令...简单。

  3. 以下是对您的脚本的轻微修改:

    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”,它只给我第二个。

在没有任何usegocreate PROCEDURE '+@dbname+'.[dbo].[krijo_database] @dbname nvarchar(2000)

的情况下尝试此操作

答案 3 :(得分:0)

你不能像那样使用GO

  1. 这不是SQL命令
  2. 告诉SSMS拆分批次
  3. 如果你删除它,那么你会得到“批处理中的第一个”错误

    在这种情况下,为什么不这样做......

    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和服务器!