SQL将一个变量添加到查询中

时间:2016-08-24 06:37:32

标签: sql sql-server ssms

如何创建一次指定的变量,然后在脚本中稍后用于查询?这些变量可以在查询中多次使用,也可以在脚本中的多个查询中使用。我在下面的示例中使用@x作为这样的变量。

我想做的是:

Declare @Query nvarchar(1000)
Declare @x nvarchar(40)

Set @x = 'test'
Set @Query = 'Select [Name]
                     , ' + @x + ' as [TestCase]
              From mytable'

Exec (@Query)

-- returns "Invalid column name 'test'"

返回上述错误。我希望它能达到相当于:

Declare @Query nvarchar(1000)
Declare @x nvarchar(40)

Set @x = 'test'
Set @Query = 'Select [Name]
                     , ''test'' as [TestCase]
              From mytable'

Exec (@Query)

-- Returns e.g.
-- Name   TestCase
-- Alice  Test
-- Bob    Test

我还注意到以下内容不起作用并返回与第一个相同的错误:

Declare @Query nvarchar(1000)
Declare @x nvarchar(40)

Set @x = 'test'
Set @Query = 'Select [Name]
                     , ' + 'test' + ' as [TestCase]
              From mytable'

Exec (@Query)

-- returns "Invalid column name 'test'"

基于错误,因为我不是试图将@x用作列名,而是作为变量,我假设我使用的是变量的无效实现。

2 个答案:

答案 0 :(得分:4)

由于您并未尝试将变量用作列名,因此根本不需要使用动态SQL。 (这是一个Good Thing(TM),因为动态SQL应该只是非常谨慎使用,因为它是一个很好的攻击面。)

简单:

declare @x nvarchar(40)

set @x = 'test'

select [Name], @x as TestCase
from mytable

会做的。

话虽这么说,如果你有一个动态SQL的用例(这里再次讨论的特定查询没有,但也许正在将特定查询传递给过程),那么要做的就是通过您的变量通过sp_executesql作为查询的参数。这类似于使用参数创建存储过程:

declare @x nvarchar(40)
declare @query nvarchar(1000)

set @x = 'test'

set @query = 'select [Name], @x as TestCase from mytable'

exec sp_executesql @query, N'@x nvarchar(1000)', @x

答案 1 :(得分:2)

你缺少引号。而已。请尝试以下代码。

$log