如何在插入

时间:2017-03-21 16:46:07

标签: sql tsql sql-server-data-tools

我在SSDT项目中有一个部署后脚本,需要记录它所部署的数据库的名称。我正在尝试声明字符串并将其设置为[$(DatabaseName)]但是无论我到目前为止如何尝试它,它仍然希望将变量解释为列名。

我试过绕过它,使用QUOTENAAME投射它,等等,没有运气。有没有办法做到这一点?

修改

这是一个精简版本,我试图使用变量

DECLARE @DatabaseName nvarchar(50) = [$(DatabaseName)]
EXEC usp_ScriptLog
@DatabaseName

usp_ScriptLog是一个非常简单的存储过程,它将一行插入到包含正在运行的脚本的数据的表中。

4 个答案:

答案 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' 

视为值而非列名。