我在sql中实现了Inline表值函数。我试图使用ado.net读取C#中从Inline表值函数返回的表值。请帮忙。我在这里附上代码。
CREATE FUNCTION fun
(
@lname varchar(50)
)
RETURNS TABLE
AS
RETURN
(
select fp.accntname,ld.BU,fp.salesop,idt.isdormant from legacy_system as ls
inner join fourth_page as fp on ls.accountname=fp.accountname
inner join linked as ld on fp.productid=ld.productid
inner join isdormant as idt on idt.productid=ld.productid
inner join legacy_system as l on ls.productid=idt.productid
where l.legacyname in(@lname)
)
GO
[HttpPost]
public void call_stored_procedure(List<string> lyname)
{
Console.WriteLine(lyname);
string dogCsv = string.Join(",", lyname.Select(i => "'" + i + "'"));
Console.WriteLine(dogCsv);
using (SqlConnection connection = new SqlConnection("data source=.; database=Srivatsava; integrated security=SSPI"))
{
connection.Open();
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "select dbo.fun(@lname)";
command.Parameters.AddWithValue("@lname", dogCsv);
command.CommandType = CommandType.Text;
String s=command.ExecuteScalar().ToString();
Console.WriteLine(s);
connection.Close();
}
}
}
答案 0 :(得分:1)
表值函数返回一个表,以便读取命令文本应该是
的结果command.CommandText = "select * from dbo.fun(@lname)";
现在您正在使用ExecuteScalar()函数来执行命令。
来自MSDN - ExecuteScalar()
执行查询,并返回第一行的第一列 查询返回的结果集。其他列或行是 忽略。
因此,即使您的函数返回包含多列的记录集,也只返回第一行的第一列。
如果需要读取表值函数返回的完整记录集,则需要使用ExecuteReader()函数。
将CommandText发送到Connection并构建一个SqlDataReader。
答案 1 :(得分:0)
以下所有链接均为related to your question
..已经解决了..所以请before post any question
..请看它已经有答案/已解决..
Calling SQL Defined function in C#