Произошла ошибка активации файла. Физическое имя файла ‘N@filename

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Приведенный ниже код t-sql компилируется нормально. Но когда я запускаю его как exec [SP_ATTACH_NW] N’C:myfolder ‘ Я получаю

Сообщение 5105, уровень 16, состояние 2, Процедура SP_ATTACH_NW, строка 14 Произошла ошибка активации файла. Физическое имя файла ‘N@mdfFileName’ может быть неправильным. Диагностируйте и исправьте дополнительные ошибки и повторите операцию.

 USE master

GO

SET ANSI_NULLS ON

GO

CREATE PROCEDURE [dbo].[SP_ATTACH_NW] (
    @DestFolder varchar(255)
)

AS

BEGIN

    SET NOCOUNT ON;

    Declare @mdfFileName varchar(255)
    Declare @ldfFileName varchar(255)

    set @mdfFileName = @DestFolder   'northwnd.mdf'
    set @ldfFileName = @DestFolder   'northwnd.ldf'

CREATE DATABASE [Northwind] ON 

( FILENAME = N@mdfFileName ),

( FILENAME = N@ldfFileName )

 FOR ATTACH


END
  

Пожалуйста, сообщите. Спасибо

Комментарии:

1. Вы не можете просто вставлять параметры в середину инструкций TSQL и ожидать, что значения параметров будут подставлены в. Для этого можно использовать динамический SQL. В любом случае, кажется странным делать это с помощью хранимой процедуры.

2. Как вы это используете? Зачем вам SP для создания базы данных?

3. ОК. приведенный ниже bgn ответил на мой вопрос. Мне нужно было переместить базу данных на другой диск, чтобы пользователи, которым не хватает места на одном диске, могли запустить небольшое приложение для этого. Используя sql dmo и c #, я смог отсоединить и переместить файлы mdf / ldf, но при подключении это не удалось из-за проблем с правами доступа к папке в новом расположении папки mdf / ldf. Вместо того, чтобы возиться с правами доступа к папке, я решил выполнить вложение через sp.

Ответ №1:

У вас не может быть переменных в аргументах filename CREATE DATABASE (MSDN не показывает @vars в синтаксисе)

Приведенный выше код буквально ищет константу «N@mdfFileName» в качестве имени файла.

Вам понадобится динамический SQL для построения строки, скажем, в @MyBuiltSQL, затем запустите EXEC(@MyBuiltSQL)

Примечание: Префикс «N» здесь в любом случае не создал бы @mdfFileName nvarchar