2012-04-03 123 views
2

我试图用SQL Server中的表达式替换变量。SQL替换查询中的表达式

例如:

Declare @someString varchar(50) 
set @someString = 's.UnitPrice + s.UnitPriceDiscount+s.LineTotal' 
Select @someString * 29,@someString + 33,@someString /2 from Sales.SalesOrderDetail as s 

我怎样才能做到这一点?

+0

你想乘/加/与整数把你的字符串,或者只是想Concat的呢?如果你想做数学运算,然后将你的字符串数据类型改为整数... – Teja 2012-04-03 15:01:27

+0

你是想要这样做,以减少键入(重用代码),或者你将有不同的公式在表达式中,并使用表达式作为查询的参数? '@ someString'从哪里来?谁做的? – 2012-04-03 15:05:51

+0

除了下面的答案外,你应该将括号中的@ @string添加到括号中,否则你会得到一些相当有趣的结果。 – 2012-04-03 15:06:02

回答

1

你可以做这样的事情:

Declare @someString varchar(50) 
DECLARE @query varchar(1000) 

set @someString = 's.UnitPrice + s.UnitPriceDiscount+s.LineTotal' 
set @query = 'Select (' + @someString + ') * 29,(' + @someString + ') 
      + 33,(' + @someString + ')/2 from Sales.SalesOrderDetail as s' 

EXEC(@query) 

但是,你必须小心你所串联起来,以避免SQL注入的问题。

+1

+1:虽然指示某人到'sp_executesql'允许参数化查询和最佳实践编码行为。 *(这里没有必要,只是在延长运行时更好,因为你的意思是继续。)* – MatBailie 2012-04-03 15:14:16

+0

我正在尝试创建一个用于报告的存储过程,而不是有冗长的组合('s.UnitPrice + s。 UnitPriceDiscount + s.LineTotal')在我的选择语句中,我正在寻找替代品。所以我想出了一个想法,让我的组合在一个变量中,并用它来添加除法等。是否有更好的方法 – Dimpu 2012-04-03 17:25:57

1

我认为你需要使用动态SQL:

DECLARE @someString VARCHAR(50) 
SET @someString = 's.UnitPrice + s.UnitPriceDiscount+s.LineTotal' 
DECLARE @SQL VARCHAR(MAX) 
SET @SQL = 'SELECT ' + @SomeString + ' * 29, ' + 
         @SomeString + ' + 33, ' + 
         @SomeString + '/2 
      FROM Sales.SalesorderDetail AS s' 

EXEC (@SQL) 
+1

+1:虽然指示某人到'sp_executesql'允许参数化查询和最佳实践编码行为。 *(这里不需要,只是在延长运行中更好,因为你的意思是继续。)* – MatBailie 2012-04-03 15:15:59

0
Declare @someString integer 
set @someString = 's.UnitPrice + s.UnitPriceDiscount+s.LineTotal' 
Select @someString * 29,@someString + 33,@someString /2 from Sales.SalesOrderDetail as s 

OR

Declare @someString varchar(50) 
set @someString = 's.UnitPrice + s.UnitPriceDiscount+s.LineTotal' 
Select (@someString+'* 29') AS Col1,(@someString+'+ 33') AS Col2,(@someString+'/2') AS Col3 from Sales.SalesOrderDetail as s 
+2

选项1将字符串分配给INT。这甚至不可能。 – MatBailie 2012-04-03 15:12:15

1

从评论

而不是冗长的组合(...)在我的选择声明中

您可以使用cross apply进行计算并在计算中重新使用计算的值。

select c.Value * 29, 
     c.Value + 33, 
     c.Value/2 
from Sales.SalesOrderDetail as s 
    cross apply (select s.UnitPrice + s.UnitPriceDiscount + s.LineTotal) as c(Value)