将XML数据作为参数传递给列表

时间:2019-07-05 17:20:28

标签: c# .net linq ado.net

我必须以某种结构化格式将数据传递给SQL,该结构化格式位于匿名类型的列表的代码侧,该SQL随后转换为Temp表并因此用于进一步的联接。当前,我正在遍历数据并使用StringBuilder创建一个字符串,该字符串实际上是CREATE临时表和INSERT INTO语句。

下面是我的代码

StringBuilder sql = new StringBuilder();
sql.Append(@"
IF OBJECT_ID('tempdb..#Student') IS NOT NULL   
    DROP TABLE #Student   

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL   
    DROP TABLE #Temp     

CREATE TABLE #Student (StudentId int,StudentName varchar(500),Marks int, DepartmentId int);");

foreach (var item in studentData)
{
    sql.AppendLine();
    sql.AppendLine("INSERT INTO #Student (");
    StringBuilder values = new StringBuilder("VALUES (");
    bool isFirstColumn = true;

    Type type = item.GetType();
    PropertyInfo[] propertyInfo = type.GetProperties();

    foreach (PropertyInfo property in propertyInfo)
    {
        string columnName = property.Name;
        object columnValue = property.GetValue(item);

        if (isFirstColumn)
            isFirstColumn = false;
        else
        {
           sql.Append(", ");
           values.Append(", ");
        }

         sql.Append(columnName);
         values.Append(columnValue);
    }
    sql.Append(") ");
    sql.AppendLine();
    sql.Append(values.ToString());
    sql.Append(")");
}

sql.AppendLine();
sql.Append(@"SELECT *
             INTO #Temp
             FROM
             (
                 SELECT *
                 FROM #Student s
                 JOIN Department d  ON s.DepartmentId = d.DepartmentId

             ) as t");

我没有使用Stored Proc的选项。有没有比使用StringBuilder更好的选择来创建Temp表,然后将其插入SQL查询中?

我们可以将列表中的数据转换为XML,然后在字符串SQL查询中添加XML格式的数据吗?

有什么比这更好的帮助或建议了吗?

谢谢

1 个答案:

答案 0 :(得分:0)

由于使用的是ADO.NET,因此可以使用Table-Valued Parameters并将表值类型传递给参数化的SQL语句。我选择使用存储过程,但是两者都可以。

修改后的MS Docs示例用法(未测试)

$unwantedProps = @($data | ? { $_ -match 'XOXO'})

if($unwantedProps.Count -gt 0)
{
    $cleanedData = $data -notmatch 'XOXO'    
    return $cleanedData
}
else {
    return
}