1

このpgmを使用して、テーブルtestの列の1つであるpartinfo.という名前のxmlstring形式の列から値を取得します。partinfo列は、多くの列を含む別のテーブルとして扱うことができます。この列の1つからデータを読み取りたいこの場合はインストールされた日付ですが、実行中に取得しています

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にインストールされたすべての日付を連結するだけなので、出力があなたが望むものかどうかはわかりません1 つの長い文字列として:

前の回答で述べたように、行ごとに複数のインストール日がある場合は、CROSS APPLY を使用してインストール日を別々の行として取得する必要があります。

CROSS APPLY を使用したデモ SQL

日付を 1 つの文字列に連結したい場合は、文字列ビルダーを使用してこれを行うことをお勧めします。

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 に答える