簡體   English   中英

存儲過程的多個參數

[英]multiple parameters for stored procedure

我需要從記錄中選擇45個字段,其中包含96個字段(不要問我,但我不能將它們標准化,如果可以,我會這樣做)。 所以,我有這個頁面,一旦它被加載到用戶面前,就需要所有那些45。

基本上,我在想,我會創建一個新的存儲過程,它將檢索所有的字段名並將它們放入一個字段和所有值並將它們放入另一個字段,基本上最終會有兩個參數。 然后我會在C#中處理它們。

現在我的問題是,1,這是正確的方法嗎? 2,如果是,我無法弄清楚如何選擇字段並將其放在一個參數上。

select @sql = ' select 'field1' + 'field2' + 'field3'.....

我迷茫到哪里開始?

好吧,有一件事你正在使這種方式比它需要的更復雜。 世界上你如何在一張桌子上擁有96列我永遠不會知道,但要選擇你需要的45列,你只需要在select語句中輸入45列。

以下是SQL的外觀示例。 當然,我不打算輸入45列,但你明白了:

SELECT FirstName, LastName, Age, [keep going to 45] FROM tblUsers

我想解決的另一個問題是你執行SQL語句的方式。 以前永遠都不會將字符串變量連接成一個SQL字符串。 確保至少使用參數化查詢。 但我建議同時調查實體框架或LINQ to SQL。

SqlCommand scomm = new SqlCommand("UPDATE tblUsers SET FirstName='" + firstName + "' WHERE UserID='" + userId + "'");

^^^等於非常糟糕。 想想如果用戶決定偷偷摸摸並將他的名字命名為Harry'AND Harry' AND Admin='true會發生什么。 你可能會想,“哦,好吧,我只會做firstName = firstName.Replace("'","''");在我所有的變量上。如果你這樣做,我會親自來打你。參與你的查詢這樣:

SqlCommand scomm = new SqlCommand("UPDATE tblUsers SET FirstName=@FirstName WHERE UserID=@UserID");
scomm.Parameters.Add(new SqlParameter("FirstName", firstName));
scomm.Parameters.Add(new SqlParameter("UserID", userId));

^^^等於更好。

編輯此外,如果您有機會重新使用您擁有的表格中的怪物,請嘗試將字段子集重構為其自己的實體(表格)並通過引用ID鏈接它們。 例如,假設我有一個名為[tlbUsers]的表,它包含有關特定用戶的信息。 像這樣:

[tlbUsers]
UserID
FirstName
LastName
Age
Username
StreetAddress
City
State
ZipCode
Country
Phone

考慮重構,以便相關值具有自己的表。 您可以從此users表中獲取所有地址信息,並將其放在名為tlbAddresses的表中。 這不僅可以在提取數據時更容易處理,而且可以節省數據庫中的空間。 例如,如果Harry和Sally都住在同一個家中,他們可以引用相同的地址記錄。

[tlbUsers]
FirstName
LastName
Age
Username
AddressID
Phone

[tlbAddresses]
AddressID
Street
City
State
ZipCode
Country

我在理解你的問題時遇到了一些麻煩,但是如果你想將可變數量的參數傳遞給存儲過程,我可以想到兩種方法,你可以分別使用SQL Server 2005和SQL Server 2008。

第一個是利用XML。 讓您的過程采用varchar(max)參數,然后您可以輕松地將其拆分。 例如,如果您逗號分隔您想要的內容,您可以:

DECLARE @xml xml
SET @xml = cast('<x>'+replace(@yourArg,',','</x><x>')+'</x>' as xml)

SELECT N.value('.','varchar(max)') AS myArgName FROM @xml.nodes('x') AS T(N)

此外,您可以利用表值變量並在表中選擇輸入並將其傳遞給存儲過程。 有關示例,請參見http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters

您可以在一個字段中將數據作為xml返回。

測試表

create table TestTbl(ID int, F1 int, F2 int, F3 int, F4 int) -- to F96

測試數據

insert into TestTbl values (1, 2, 3, 4, 5)

詢問

select
  (select
    F1, F2, F3, F4 -- to F45 
   from TestTbl
   where ID = 1
   for xml path('root'), type) as XMLData

結果

XMLData
-----------------------------------------------------
<root><F1>2</F1><F2>3</F2><F3>4</F3><F4>5</F4></root>

XMLData字段中的XML

<root>
  <F1>2</F1>
  <F2>3</F2>
  <F3>4</F3>
  <F4>5</F4>
</root>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM