SQL 向查询添加变量

SQL add a variable to a query

如何创建在脚本中指定一次并在稍后的查询中使用的变量?这些变量可以在一个查询中多次使用,也可以在一个脚本的多个查询中使用。我在下面的示例中使用 @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'"

其中returns上面提到的错误。我希望它达到相当于:

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

我还注意到以下内容不起作用,并且 returns 与第一个错误相同:

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 用作列名,而是将其用作变量,因此我假设我使用的是无效的变量实现。

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

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

print @query

输出:
Select [名称],'test' 作为 [测试用例] 来自我的表

由于您没有尝试将变量用作列名,因此根本不需要使用动态 SQL。 (这是一件好事(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

你漏掉了引号。而已。试试下面的代码。

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

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

    Exec (@Query)