Хранимая процедура в SQL 2008 - PullRequest
0 голосов
/ 19 декабря 2009

Я создал хранимую процедуру с VB.NET

Эта процедура идет на удаленный сервер (на данный момент на моем ближайшем сервере Win 2003) до сих пор все в порядке

Процедура создана, и я звоню ей из моей программы

Имя: sp_AddStreamDB

mycommand = new sqlcommand("EXEC sp_AddStreamDB 'C:\sqlDATA\', 'RemoteDB'",RemoteSQLConn)
myCommand.ExecuteNonQuery()

Обычно процедура принимает два параметра, и она помещает их туда, где нужно выполнить, но это не происходит

CREATE PROCEDURE [dbo].[sp_AddStreamDB] (
     -- Add the parameters for the stored procedure here
     @DPath varchar(max)
    ,@DBName varchar(50)
    ,@Qchar varchar(1) = "'"
    )
AS 
    BEGIN_TRY:
    SET QUOTED_IDENTIFIER ON ;
    SET NOCOUNT ON ;
    -- Insert statements for procedure here
    DECLARE @ErrMsg nvarchar(4000)
       ,@DBName1 varchar(50)
       ,@DBName2 varchar(50)
       ,@DBNamefs varchar(50)
       ,@DBNamelog varchar(50)
       ,@FileGroupN varchar(100)
       ,@DATName varchar(max)
       ,@LOGName varchar(max)
       ,@FSName varchar(max)

    SET @DBName1 = ( @DBName + '1' )
    SET @DBName2 = ( @DBName + '2' )
    SET @DBNamefs = ( @DBName + 'fs' )
    SET @DBNamelog = ( @DBName + 'log' )
    SET @FileGroupN = ( @DBname + 'StreamGroup' )
    SET @DATName = ( @Qchar + @DPath + @DBName + '_dat.mdf' + @Qchar )
    SET @LOGName = ( @Qchar + @DPath + @DBName + '_log.ldf' + @Qchar )
    SET @FSName = ( @Qchar + @DPath + @DBName + '_fs' + @Qchar )

    BEGIN_CATCH:
    SELECT  ERROR_MESSAGE() AS ErrorMessage ;
    SELECT  @ErrMsg = ERROR_MESSAGE()

    CREATE DATABASE DBName
    ON PRIMARY 
       (
         NAME = DBName1
        ,FILENAME = DATName
       ),
    FILEGROUP FileGroupN CONTAINS FILESTREAM
      (
        NAME = DBNamefs
        ,FILENAME = FSName
       )
    LOG ON
       (
        NAME = DBNamelog
        ,FILENAME = LOGName
        )

    RAISERROR (@ErrMsg,1,1)
    RETURN 0
    END_CATCH:
    END_TRY:

=====================

СОЗДАНИЕ БАЗЫ ДАННЫХ - важная проблема

Эта процедура выдает мне сообщение об ошибке «Имя файла« DATName »имеет неправильный формат .....»

varable @DATName - 'C:\sql\DATA\RemoteDB.dat.mdf' (я должен проверить это PRINT @DATName, и все в порядке

Но по какой-то причине строка CREATE DATABASE отказалась принимать значение переменной и принимает только имя (только имя) DATName, которое пытается использовать имя в качестве значения и, конечно, возвращает ошибку

1024 * сейчас *

ТАМ НИКТО, КОТОРЫЙ МОЖЕТ ПОМОЧЬ МНЕ В ЭТОМ ВЫПУСКЕ?

После некоторых советов по устранению неполадок я изменил свой код на это:

PRINT @DATName
CREATE DATABASE [@DBName]
ON PRIMARY
   (
     NAME = '@DBName1'
    ,FILENAME = '@DATName'
   ),
FILEGROUP [@FileGroupN] CONTAINS FILESTREAM
  (
    NAME = '@DBNamefs'
   ,FILENAME = '@FSName'
  )
LOG ON 
  (
   NAME = '@DBNamelog'
   ,FILENAME = '@LOGName'
   )

и я принимаю ошибку: Произошла ошибка активации файла. Физическое имя файла «@DATName» может быть неправильным. Диагностируйте и исправьте дополнительные ошибки и повторите операцию. СОЗДАТЬ БАЗУ ДАННЫХ не удалось. Некоторые имена файлов не могут быть созданы. Проверьте связанные ошибки.

Конечно, @DATName: 'C:\sqlDATA\RemoteDB_dat.mdf'

То же самое я беру, снимая скобки И то же самое я принимаю, когда удаляю одинарные кавычки

Лефтерис Гкинис pginis@principalit.gr 0030 22960 32843

Ответы [ 3 ]

1 голос
/ 20 декабря 2009

Я вполне уверен, что вы не можете передавать переменные в оператор CREATE DATABASE. Вам нужно будет создать всю CREATE DATABASE внутри переменной varchar, а затем передать ее в sp_executesql.

0 голосов
/ 21 декабря 2009

Это работает здесь

CREATE PROCEDURE [dbo].[sp_AddStreamDB] (
     @Path nvarchar(500)
    ,@DBName nvarchar(120)
    )
AS 
    SET NOCOUNT ON
    BEGIN TRY

        DECLARE @File1Logical nvarchar(120)
           ,@File1Physical nvarchar(500)
           ,@StreamGroup nvarchar(120)
           ,@StreamLogical nvarchar(120)
           ,@StreamPhysical nvarchar(500)
           ,@LogLogical nvarchar(120)
           ,@LogPhysical nvarchar(500)
           ,@exe nvarchar(4000)
           ,@ErrMsg nvarchar(2048)


        SET @File1Logical = @DBName + N'1'
        SET @File1Physical = @Path + +@DBName + N'_dat.mdf'
        SET @LogLogical = @DBName + N'log'
        SET @LogPhysical = @Path + @DBName + N'_log.ldf'
        SET @StreamGroup = @DBName + N'fs'
        SET @StreamLogical = @DBname + N'StreamGroup'
        SET @StreamPhysical = @Path + @DBName + N'_fs'

        SET @exe = N'
        CREATE DATABASE <db_name_here>
        ON PRIMARY 
            (
              NAME = <file1_logical_here>
             ,FILENAME = ''<file1_physical_here>''
             ),
        FILEGROUP <streamgroup_here> CONTAINS FILESTREAM
            (
              NAME = <stream_logical_here>
             ,FILENAME = ''<stream_physical_here>''
             )
        LOG ON 
             (
               NAME = <log_logical_here>
              ,FILENAME = ''<log_physical_here>''
              )'

        SET @exe = REPLACE(@exe, N'<db_name_here>', @DBName)
        SET @exe = REPLACE(@exe, N'<file1_logical_here>', @File1Logical)
        SET @exe = REPLACE(@exe, N'<file1_physical_here>', @File1Physical)
        SET @exe = REPLACE(@exe, N'<log_logical_here>', @LogLogical)
        SET @exe = REPLACE(@exe, N'<log_physical_here>', @LogPhysical)
        SET @exe = REPLACE(@exe, N'<streamgroup_here>', @StreamGroup)
        SET @exe = REPLACE(@exe, N'<stream_logical_here>', @StreamLogical)
        SET @exe = REPLACE(@exe, N'<stream_physical_here>', @StreamPhysical)

        EXEC sp_executesql @exe
    END TRY
    BEGIN CATCH
        SET @ErrMsg = ERROR_MESSAGE()
        RAISERROR (@ErrMsg,1,1)
        RETURN 0
    END CATCH
    RETURN 1

Для проверки:

DECLARE @RC int

EXECUTE @RC = [dbo].[sp_AddStreamDB]  @Path =N'c:\db\',@DBName =N'SomeDB'
SELECT @RC

Каталог c:\db\ должен существовать, и учетная запись службы sql должна иметь разрешения на чтение / запись.

0 голосов
/ 19 декабря 2009
CREATE DATABASE DBName ON PRIMARY (NAME = DBName1, FILENAME = DATName), FILEGROUP FileGroupN CONTAINS FILESTREAM (NAME = DBNamefs, FILENAME = FSName) LOG ON (NAME = DBNamelog, FILENAME = LOGName)

возможно, вы оставили @ в переменных этой команды¿

CREATE DATABASE @DBName ON PRIMARY (NAME = @DBName1, FILENAME = @DATName), FILEGROUP @FileGroupN CONTAINS FI

EDIT

Другое решение, более сложное, но я уверен, что оно работает (я использовал его много раз):

  • Динамически создайте команду создания базы данных в VB (весь текст, без параметров )
  • Запустите команду из VB, чтобы создать новый SP в базе данных master с вашим новым фиксированным параметром.
  • Запустить новый master SP из VB (база данных будет создана)
  • Запустите команду из VB для удаления master SP

Это не так умно, как ваше первоначальное решение, но оно работает.

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