是否可以获取数据库项目中脚本文件的内容?
Is it possible to get the content of a script file in a database project?
好的,所以我有一个 Visual Studio 数据库项目,我正在尝试做一些 post 部署工作 (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 Database V12.
更新:这是如何解决的
这就是我在 John 的帮助下得到的结果。
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
只是一个想法,但我在你的列表中没有看到 OPENROWSET
Declare @S varchar(max);
Select @S = BulkColumn FROM OPENROWSET(BULK 'C:\SomeDir\SomeScript.sql', SINGLE_BLOB) x;
Print @S
--Exec(@S)
转到数据库,然后右键单击您想要的脚本的 table,然后单击 "script table as",它会显示另一个显示 "create to" 的部分,单击它会打开另一个部分然后 select "new query editor window" 单击它,您的查询就会出现,将其复制并粘贴到需要的地方。
右键单击 table----> 脚本 table as-----> 创建到----> 新查询编辑器 window
其实我没有正确地得到你的解释。我刚刚向您展示了如何让脚本从一个地方复制到另一个地方
好的,所以我有一个 Visual Studio 数据库项目,我正在尝试做一些 post 部署工作 (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 Database V12.
更新:这是如何解决的
这就是我在 John 的帮助下得到的结果。
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
只是一个想法,但我在你的列表中没有看到 OPENROWSET
Declare @S varchar(max);
Select @S = BulkColumn FROM OPENROWSET(BULK 'C:\SomeDir\SomeScript.sql', SINGLE_BLOB) x;
Print @S
--Exec(@S)
转到数据库,然后右键单击您想要的脚本的 table,然后单击 "script table as",它会显示另一个显示 "create to" 的部分,单击它会打开另一个部分然后 select "new query editor window" 单击它,您的查询就会出现,将其复制并粘贴到需要的地方。 右键单击 table----> 脚本 table as-----> 创建到----> 新查询编辑器 window 其实我没有正确地得到你的解释。我刚刚向您展示了如何让脚本从一个地方复制到另一个地方