如何创建一次指定的变量,然后在脚本中稍后用于查询?这些变量可以在查询中多次使用,也可以在脚本中的多个查询中使用。我在下面的示例中使用@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
用作列名,而是作为变量,我假设我使用的是变量的无效实现。
答案 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