2012-04-03 65 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)