Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储过程的多个参数_C#_Sql_Tsql_Parameters_Procedure - Fatal编程技术网

C# 存储过程的多个参数

C# 存储过程的多个参数,c#,sql,tsql,parameters,procedure,C#,Sql,Tsql,Parameters,Procedure,我需要从一个有96个字段的记录中选择45个字段不要问我,但我不能规范化它们,如果可以的话我会这么做。所以,我有一个页面,当它加载到用户面前时,需要所有45个页面 基本上,我在想,我将创建一个新的存储过程,它将检索所有字段名并将它们放入一个字段中,所有值并将它们放入另一个字段中,最终基本上会得到两个参数。然后我会用C语言处理它们 现在我的问题是,1,这样做对吗?第二,如果是的话,我不知道如何选择字段并将其放在一个参数上 select @sql = ' select 'field1' + 'fiel

我需要从一个有96个字段的记录中选择45个字段不要问我,但我不能规范化它们,如果可以的话我会这么做。所以,我有一个页面,当它加载到用户面前时,需要所有45个页面

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

现在我的问题是,1,这样做对吗?第二,如果是的话,我不知道如何选择字段并将其放在一个参数上

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

我不知道从哪里开始?

我在理解您的问题时有点困难,但是如果您想向存储过程传递数量可变的参数,我可以想到两种方法,分别需要SQL Server 2005和SQL Server 2008

第一种方法利用XML。让您的过程接受一个varcharmax参数,然后您可以轻松地将其拆分。例如,如果用逗号分隔所需内容,则可以:

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)

此外,还可以利用表值变量,将输入选择到表中,并将其传递给存储过程。例如,请参阅。

有一件事,您正在使这种方式变得比需要的更复杂。我永远也不知道一个表上有96列,但要选择所需的45列,只需在select语句中键入45列即可

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

SELECT FirstName, LastName, Age, [keep going to 45] FROM tblUsers
我想解决的另一个问题是执行SQL语句的方式。永远不要将字符串变量连接到一个SQL字符串中。至少要确保您使用的是参数化查询。但我建议您也找个时间研究一下实体框架或LINQtoSQL

SqlCommand scomm = new SqlCommand("UPDATE tblUsers SET FirstName='" + firstName + "' WHERE UserID='" + userId + "'");
那相当于非常糟糕。想想如果一个用户决定偷偷摸摸,把他的名字改成“Harry”和“Admin=”真,会发生什么。你可能会想,哦,我只做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表中获取所有地址信息,并将其放在一个名为tlbaddress的表中。这不仅会使在提取数据时更容易处理,而且可能会节省数据库中的空间。例如,如果哈利和萨利都住在同一个家里,他们可以引用同一个地址记录

[tlbUsers]
FirstName
LastName
Age
Username
AddressID
Phone

[tlbAddresses]
AddressID
Street
City
State
ZipCode
Country

可以在一个字段中以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)
质疑

结果

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>

仅使用普通的选择字段1、字段2等有什么问题。。。从表1开始?不要让它变得更复杂,特别是如果没有充分的理由,它可能就是我,但不应该尽可能避免存储过程吗?还有,为什么不简单地选择您需要的列呢?作为旁注,根据你的用户界面的外观和自由度,也许你可以重新组织它,以限制一次显示的信息总量。我真的不喜欢看到复杂的界面UIs@dSebastien-适当时应使用存储过程。否则,它们为什么会存在?始终是相同的45个字段,还是用户可以选择使用哪45个字段?如果您的公司有一个DBA负责维护整个数据库,则存储过程可能很有用。他选择向开发人员公开哪些函数。有很多争论,但如果您使用或不使用存储过程,在性能上没有区别。因此,我认为这只是个人喜好,也是最适合贵公司的。我不同意杰夫·阿特伍德的观点。是的,对于小项目来说,它们既麻烦又毫无意义。但是对于大型项目,他们鼓励您更有效地使用提供给您的数据,而不是进行另一个小查询。所以,是的,我知道如何创建sql。我想问的是,如果我不写45列,而是尝试在字段周围循环并连接它,这样我就可以将它插入一个字段,将值插入另一个字段,并将其用作我的sp的输出。我会很糟糕地将这个表规范化!我现在不行。是的,不幸的是,我认为这只野兽必须通过在你的查询中输入很多来对付。其他任何事情都太过分了。重构我创建的表会更容易 从长远来看。
<root>
  <F1>2</F1>
  <F2>3</F2>
  <F3>4</F3>
  <F4>5</F4>
</root>