我需要从记录中选择45个字段,其中包含96个字段(不要问我,但我不能将它们标准化,如果可以,我会这样做)。所以,我有这个页面,一旦它被加载到用户面前,就需要所有那些45。
基本上,我在思考,我会创建一个新的存储过程,它将检索所有的字段名并将它们放入一个字段和所有值并将它们放入另一个字段,基本上最终会有两个参数。然后我会在C#中处理它们。
现在我的问题是,1,这是正确的方法吗? 2,如果是,我无法弄清楚如何选择字段并将其放在一个参数上。
select @sql = ' select 'field1' + 'field2' + 'field3'.....
我很困惑从哪里开始?
答案 0 :(得分:2)
嗯,有一件事你正在使这种方式比它需要的更复杂。世界上你如何在一张桌子上拥有96列我永远不会知道,但要选择你需要的45列,你只需要在select语句中输入45列。
以下是SQL的外观示例。当然,我不打算输入45列,但你明白了:
SELECT FirstName, LastName, Age, [keep going to 45] FROM tblUsers
我想解决的另一个问题是你执行SQL语句的方式。以前永远都不会将字符串变量连接成一个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
考虑重构,以便相关值具有自己的表。您可以从此users表中获取所有地址信息,并将其放在名为tlbAddresses的表中。这不仅可以在提取数据时更容易处理,而且可以节省数据库中的空间。例如,如果Harry和Sally都住在同一个家中,他们可以引用相同的地址记录。
[tlbUsers]
FirstName
LastName
Age
Username
AddressID
Phone
[tlbAddresses]
AddressID
Street
City
State
ZipCode
Country
答案 1 :(得分:0)
我在理解您的问题时遇到一些麻烦,但是如果您想将可变数量的参数传递给存储过程,我可以想到两种方法可以做到这一点,这需要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。
答案 2 :(得分:0)
您可以在一个字段中将数据作为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>