1

我使用这个 pgm 从名为 partinfo 的 xmlstring 格式的列中获取值。它是表 test 中的列之一。partinfo 列可以被视为另一个包含许多列的表。我想从其中一个列中读取数据在这种情况下是安装日期。但是在执行时我得到了一个

sql异常:找不到列“partinfo”或用户定义的函数或聚合“partinfo.query”,或者名称不明确。我该如何解决这个问题。

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            try {

               SqlConnection con = new 
                   SqlConnection("Data Source=NIP007\\SQLEXPRESS;
                        Initial Catalog=test;User ID=sa;Password=nest123@!");
                con.Open();


            string query =  "SELECT [partinfo].query('.//InstalledDate').value('.','VARCHAR(MAX)')FROM [test]";

            SqlCommand cmd = new SqlCommand(query, con);
           // StringBuilder builder=new StringBuilder();
           // string PartInfo=string.Empty;


            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                string str5 =dr.ToString();
                if (!string.IsNullOrEmpty(str5))
                {

                    textBox1.Text=str5;
                }
            }

        }
        catch(Exception ex)
        {

        }
      }
   }
}
4

1 回答 1

0

目前尚不清楚您的错误到底在哪里,因为您的 SQL 应该可以正常工作(Demo Here)并且不会返回错误,尽管我不确定输出是否是您想要的,因为它只是连接了 XML 中的所有已安装日期作为一个长字符串:

正如我之前的回答中所说,如果每行有多个安装日期,您将需要使用 CROSS APPLY 将安装日期作为单独的行获取。

使用 CROSS APPLY 的演示 SQL

如果您真的希望将日期连接到一个字符串,那么我建议使用字符串生成器来执行此操作:

try
{
    string query = @"SELECT  InstalledDate = x.value('InstalledDate[1]', 'DATETIME')
                    FROM    dbo.Test
                            CROSS APPLY PartInfo.nodes('/DocumentElement/PartInfo') p (x);";

    using (var con = new SqlConnection("Data Source=NIP007\\SQLEXPRESS;Initial Catalog=test;User ID=sa;Password=nest123@!"))
    using (var cmd = new SqlCommand(query, con))
    {
        con.Open();
        using (var dr = cmd.ExecuteReader())
        {
            var builder = new StringBuilder();
            while (dr.Read())
            {
                string str5 = dr.GetString(0);
                if (!string.IsNullOrEmpty(str5))
                {
                    builder.Append(str5 + ",");
                }
            }
            textBox1.Text = builder.ToString();
        }
    }

}
catch (Exception ex)
{
}

如果这没有帮助,您可以发布表测试的 DDL 和一些示例数据。

谢谢

于 2013-02-08T09:08:52.160 回答