Использовать базу данных динамически - PullRequest
4 голосов
/ 14 апреля 2010

Это выполнение дает мне следующую ошибку:

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 ]

2 голосов
/ 14 апреля 2010

Два выпуска:

  1. Использование «GO» некорректно ... нет ключевого слова SQL с именем «GO» ... , это просто хак, который выполняет SQL Server Management Studio для вас.

  2. Вам нужна команда 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 голос
/ 14 апреля 2010

Некоторое время назад у меня был код, который обновлял структуру базы данных на основе скриптов. Я получаю разделенный файл с помощью 'go' и выполняю отдельно каждый фрагмент. Вы можете попробовать это?

Итак, сначала выражение exec use, а затем exec createprocedure.

Убедитесь, что он создан в соответствующей базе данных

0 голосов
/ 15 апреля 2010

Я использовал SQl DMO! Отличная функция как для 32, так и для 64-разрядных, совместимая как с SQL Express, так и с сервером!

0 голосов
/ 15 апреля 2010

Вы должны создать хранимую процедуру с этой частью с переменной.

0 голосов
/ 14 апреля 2010

То, что вы ищете, не может быть сделано, я не думаю.

См. эту статью для справки

0 голосов
/ 14 апреля 2010

Реальная процедура, которую я хотел бы использовать, очень большая, больше чем 50000 строк, и я не могу менять цитаты на все

В Microsoft SQL Server максимальная длина varchar составляет 8000 символов.

http://www.databasejournal.com/features/mssql/article.php/3788256/Data-Types-in-SQL-Server-2008.htm

0 голосов
/ 14 апреля 2010
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
0 голосов
/ 14 апреля 2010

Вы не можете использовать GO, как это

  1. Это не команда SQL
  2. Указывает SSMS разделить партию

Если вы удалите его, вы получите ошибку «first in batch», которая ожидается

В таком случае, почему бы просто не сделать это ...

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 для создания хранимой процедуры?

0 голосов
/ 14 апреля 2010

Моя ошибка, я чего-то не заметил.

может быть, это Exec внутри Exec, который вызывает ошибку?

или потому что вы присваиваете nvarchar (2000) nvarchar (100)

«Сообщение 102, уровень 15, состояние 1, строка 5 Неправильный синтаксис рядом с« go ». Сообщение 111, уровень 15, состояние 1, строка 11« CREATE / ALTER PROCEDURE »должно быть первым оператором в пакете запроса». Если я уберу «GO», это даст мне только второй.

попробуйте без use или go: create PROCEDURE '+@dbname+'.[dbo].[krijo_database] @dbname nvarchar(2000)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...