Можно ли получить содержимое файла сценария в проекте базы данных? - PullRequest
1 голос
/ 29 сентября 2019

Хорошо, у меня есть проект базы данных Visual Studio, в котором я пытаюсь выполнить некоторые действия после развертывания (Script.PostDeployment.sql).

Что я пытаюсь сделать?

Мне нравится копировать содержимое файла сценария и вставлять его в процедуру .

Обзор

ИтакУ меня есть файл с некоторым SQLCMD

MyScriptFileWithSomeInserts.sql -- The content I like to log is in this file

exec InsertDataProcedure [ScriptContent] -- How can I get it here?

Здесь у нас есть псевдокод того, что я пытаюсь сделать

-- read file and insert to variable
:setvar ScriptContent :r MyScriptFileWithSomeInserts.sql 

-- input the content to the procedure
exec InsertDataProcedure [@ScriptContent] 

Что я пробовал?

1

Следующая ошибка не выполняется, потому что это не процедура, а всего лишь сценарий в моем проекте базы данных.

declare @ScriptContent nvarchar(Max)
SELECT @ScriptContent = OBJECT_DEFINITION(OBJECT_ID(N'MyScriptFileWithSomeInserts.sql'))
exec InsertDataProcedure @ScriptContent 

2

Я пытался использовать : r ( SQLCMD ) для чтения файла

declare @xx nvarchar(Max) =
:r MyScriptFileWithSomeInserts.sql

exec InsertDataProcedure [@ScriptContent] 

3

Я пытался использовать всеразличные варианты SQLCMD , например, : i для чтения файла

declare @xx nvarchar(Max) =
:i MyScriptFileWithSomeInserts.sql

exec InsertDataProcedure [@ScriptContent] 

Моя настройка

Visual Studio 2019 и целевая платформа MS AzureБаза данных SQL V12.

Обновление:Как это было решено

Это то, чем я закончил после помощи Джона.

DECLARE @solutionDir VARCHAR(200),@File VARCHAR(200)
-- In the SQLCMD I have access to $(SolutionPath) so I need to do some 
-- cleaningto get the absolute path to the file
SELECT @solutionDir = REPLACE('$(SolutionPath)','MySolution.sln','');
SET @File = @solutionDir + 'Databases\MyDb\MyScriptFileWithSomeInserts.sql'

DECLARE @retvalue nvarchar(max)  
DECLARE @SQL nvarchar(max);
DECLARE @ParmDef nvarchar(50);

-- Read the content of the file
SELECT @SQL = N'SELECT @retvalOUT = BulkColumn FROM OPENROWSET(BULK ''' + @File + ''', SINGLE_BLOB) AS x' ;   
SET @ParmDef = N'@retvalOUT nvarchar(max) OUTPUT';

EXEC sp_executesql @SQL, @ParmDef, @retvalOUT=@retvalue OUTPUT;

-- And here I have all the content of the file.
PRINT '@retvalue: ' + @retvalue

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

Просто мысль, но я не увидел OPENROWSET в вашем списке

Declare @S varchar(max); 
Select @S = BulkColumn FROM  OPENROWSET(BULK 'C:\SomeDir\SomeScript.sql', SINGLE_BLOB) x; 


Print @S
--Exec(@S)
0 голосов
/ 30 сентября 2019

Перейдите в базу данных, затем щелкните правой кнопкой мыши таблицу, для которой вы хотите создать сценарий, и выберите «таблица сценариев как», в ней отобразится другой раздел, показывающий «создать для», щелкните по нему, откроется другой раздел и выберите «окно нового редактора запросов». нажмите на это, и ваш запрос появится, скопируйте его и вставьте туда, где это необходимо. щелкните правой кнопкой мыши таблицу ----> таблица сценариев как -----> создать в ----> новое окно редактора запросов На самом деле я не правильно получил ваше объяснение. я только что показал вам, как заставить скрипт копировать из одного места в другое

...