#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