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