2011-03-03 9 views
0

96個のレコードから45個のフィールドを選択する必要があります(私には質問しませんが、標準化できません。だから、私はこのページを持っています。このページには、ユーザーの前にロードされているすべての45ページが必要です。ストアドプロシージャの複数のパラメータ

基本的には、すべてのフィールド名を取得して1つのフィールドとすべての値に入れて別のフィールドに入れ、基本的には2つのパラメータになる新しいストアドプロシージャを作成します。私はその後、C#でそれらを処理することになります。

今私の質問は、1、正しい方法ですか?第二に、もし私がフィールドを選択し、それを1つのパラメータに入れる方法を理解できないのであれば。

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

ここでどこを開始するのですか?

+1

通常のselect field1、field2、...をtable1から使用するとどうなりますか?特にそれがいい理由がない場合は、それはより複雑にしないでください –

+0

それは私だけかもしれませんが、可能な限り、ストアドプロシージャを避けるべきではありませんか?また、必要な列を選択するだけではどうですか?あなたのUIがどのようなものか、どのような自由があるかによって、一度に表示される情報の総量を制限するために再編成することができます(複雑なUIを見るのは本当に好きではありません) – dSebastien

+4

@dSebastien - 必要に応じてストアドプロシージャを使用する必要があります。彼らはなぜそうでなければ存在するでしょうか? – Oded

答えて

2

これは、必要以上に複雑な方法です。どのように私は決して知ることができない1つのテーブルに96の列を持っている世界でどのように45を選択するには、単にselect文に45の列を打ち込む必要があるでしょう。

ここに、SQLの外観のサンプルがあります。当然のことながら、私は45列を入力するつもりはないが、あなたのアイデアを得る:

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

私が対処したいと思います他の問題は、あなたのSQL文を実行している方法です。文字列変数を1つのSQL文字列に連結してきたことは決してありません。少なくとも、パラメータ化されたクエリを使用していることを確認してください。しかし、いつかEntity FrameworkやLINQ to SQLを調べることをお勧めします。

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

その^^^は非常に悪いです。ユーザーが卑劣で、彼のファーストネームを作ることにした場合、どうなるか考えてみてください。Harry' AND Admin='trueあなたは、ああ、よく私はちょうど私のすべての変数のfirstName = firstName.Replace("'","''");をやる」、と思うかもしれないあなたは、私が個人的に来ることを行う場合にパンチのようにクエリをパラメータ:。。

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

^^^それははるかに良いと等しいですあなたは今まであなたが持っているテーブルの再作業そのモンスターにチャンスを得れば。

EDITまた、自分のエンティティ(テーブル)にフィールドのサブセットをリファクタリングし、参照IDを経由してそれらをリンクしてみてください。例えば、 [tlbUsers]というテーブルがあり、特定のユーザーに関する情報が含まれているとします。このように:

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

リファクタリングを考慮して、関連する値に独自のテーブルがあるようにします。このユーザーテーブルからすべてのアドレス情報を取得し、それをtlbAddressesというテーブルに入れることができます。データを取り込む際の処理が簡単になるだけでなく、データベースのスペースを節約できる可能性があります。たとえば、HarryとSallyの両方が同じ家に住んでいる場合、同じアドレスレコードを参照することができます。

[tlbUsers] 
FirstName 
LastName 
Age 
Username 
AddressID 
Phone 

[tlbAddresses] 
AddressID 
Street 
City 
State 
ZipCode 
Country 
+0

だから、ええ、私はSQLを作る方法を知っています。私が尋ねていたのは、フィールドをループして連結するだけで、フィールドと値を別のフィールドに挿入して、それを私のspの出力として使うことができるように、45列を書くのではなく、と私はLOOOOVEEEので、このテーブルを正常化するだろう!私はちょうど今はできません。 – gdubs

+0

ええ、残念ながら私はこの獣はあなたの質問にたくさんのタイピングをしなければならないと考えています。他の何もかもは過度のものです。長期的にはテーブルをリファクタリングする方が簡単です。 – Chev

0

あなたの質問を理解するのに少し問題がありますが、ストアドプロシージャに可変数のパラメータを渡す場合は、SQL Server 2005とSQLが必要なことを考える方法が2つありますサーバー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を参照してください。

0

データをXML形式で1つのフィールドに戻すことができます。

テストテーブル

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> 

XML in XMLDataフィールド

<root> 
    <F1>2</F1> 
    <F2>3</F2> 
    <F3>4</F3> 
    <F4>5</F4> 
</root> 
関連する問題