【发布时间】:2019-09-29 18:21:29
【问题描述】:
好的,所以我有一个 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
【问题讨论】:
-
sp_executesql。并且不要将 SQLCMD 变量与 TSQL 变量混淆。不是一回事。 -
我忘了注意我确实尝试使用 sp_executesql 但没有成功。你能告诉我你的想法吗?
-
我只有一秒钟的时间来浏览它。因此,如果您能够从 SQLCMD 运行,那么为什么不只是
:r MyScriptFileWithSomeInserts.sql后跟GO? -
查看我使用 :r 的尝试 nr 2。我试图将文件的所有内容发送到我将其保存到表的过程中。这是一个审计举措。因此,我一直在尝试以各种可以想到的方式使用 :r(至少对我而言)。请告诉我,如果你有这个给我,那就太棒了!
-
好吧,如果您需要将其作为字符串引入并将其传递给存储过程以进行审计,从而改变事情。您是否可以控制如何创建此插入批次?多长时间?
标签: sql sql-server sqlcmd database-project