0

I need to select 45 fields from a record which has 96 of them (dont ask me, but i can't normalize them, i would if i could). So, I have this page who would need all those 45 on them once it's loaded in front of the user.

Basically, I was thinking, I would make a new stored proc that would retrieve all the fieldnames and put them into one field and all the values and put them into another field and basically would end up with two parameters. I would then end up processing them in C#.

Now my question is, 1, is it the right way to do it? 2nd, if it is I can't figure out how to select the fields and put it on one parameter.

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

im confused on where to start?

4

3 に答える 3

2

一つには、この方法を必要以上に複雑にしています。一体どのように 1 つのテーブルに 96 列あるのかはわかりませんが、必要な 45 列を選択するには、select ステートメントで 45 列を入力するだけです。

これは、SQL がどのように見えるかのサンプルです。当然のことながら、45 列を入力するつもりはありませんが、アイデアはわかります。

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

私が対処したいもう 1 つの問題は、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 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

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

[tlbUsers]
FirstName
LastName
Age
Username
AddressID
Phone

[tlbAddresses]
AddressID
Street
City
State
ZipCode
Country
于 2011-03-03T20:16:41.260 に答える
0

1つのフィールドでデータを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>
于 2011-03-04T06:43:06.607 に答える
0

あなたの質問を理解するのに少し苦労していますが、可変数のパラメーターをストアド プロシージャに渡したい場合は、SQL Server 2005 と SQL Server 2008 をそれぞれ必要とする 2 つの方法が考えられます。

1 つ目は 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を参照してください。

于 2011-03-03T20:09:22.047 に答える