0

我需要从包含 96 个字段的记录中选择 45 个字段(不要问我,但我无法将它们标准化,如果可以的话我会的)。所以,我有这个页面,一旦它加载到用户面前,它就需要所有这 45 个。

基本上,我在想,我会创建一个新的存储过程,它将检索所有字段名并将它们放入一个字段和所有值并将它们放入另一个字段,基本上最终会得到两个参数。然后我将最终在 C# 中处理它们。

现在我的问题是,1,这是正确的方法吗?第二,如果是我不知道如何选择字段并将其放在一个参数上。

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

我对从哪里开始感到困惑?

4

3 回答 3

2

好吧,一方面,您正在使这种方式变得比需要的更复杂。我永远不会知道你在一张表上有 96 列是怎么回事,但要选择你需要的 45 列,你只需要在 select 语句中输入 45 列。

下面是 SQL 的样例。当然,我不会输入 45 列,但你明白了:

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

我想解决的另一个问题是您执行 SQL 语句的方式。NEVER EVER EVER EVER EVER 将字符串变量连接成一个 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

我在理解您的问题时遇到了一些麻烦,但是如果您想将可变数量的参数传递给存储过程,我可以想到有两种方法可以做到,分别需要 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 。

于 2011-03-03T20:09:22.047 回答
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>
于 2011-03-04T06:43:06.607 回答