繁体   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