我在SSDT项目中有一个部署后脚本,需要记录它所部署的数据库的名称。我正在尝试声明字符串并将其设置为[$(DatabaseName)]
但是无论我到目前为止如何尝试它,它仍然希望将变量解释为列名。
我试过绕过它,使用QUOTENAAME
投射它,等等,没有运气。有没有办法做到这一点?
修改
这是一个精简版本,我试图使用变量
DECLARE @DatabaseName nvarchar(50) = [$(DatabaseName)]
EXEC usp_ScriptLog
@DatabaseName
usp_ScriptLog
是一个非常简单的存储过程,它将一行插入到包含正在运行的脚本的数据的表中。
答案 0 :(得分:1)
如果要在部署后脚本中获取要部署的数据库的名称,则不需要使用cmd变量 - 您可以使用普通的t-sql,例如:
Select db_name()
我总是喜欢在sql cmd变量上使用普通t-sql,因为添加它会影响每个构建和部署步骤。
答案 1 :(得分:1)
你应该能够正常引用它,在SQLCMD模式下在SSMS中玩它比VS更全面,但为了这个目的,我认为它的工作方式是一样的。
:setvar DatabaseName" MyDB"
声明@Test表(Value1 varchar(50))
插入@Test(Value1)值(' [$(DatabaseName)]')
选择*来自@Test
这是针对字符串的,但它取决于您在SP中使用它做什么。
答案 2 :(得分:0)
我不确定,但如果你删除那些括号,它可能会起作用。因为数据库和列名称不能包含除“_”之外的特殊字符。
答案 3 :(得分:0)
好吧,你可以在插入行时在参数周围包装单引号字符代码(39),这会强制它将其视为字符串值。我不认为它是强制性的,但我在这种情况下使用sp_executesql,可能来自你的存储过程(如果它在你的脚本中不可行):
Declare @your_query nvarchar(1000)='
INSERT INTO [Table] (database_name)
SELECT '+char(39)+@DatabaseName+char(39)
EXEC sp_executesql @your_query
等效的运行时:
INSERT INTO [Table] (database_name)
SELECT 'YourParameterValue'
视为值而非列名。