Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Sql server 使用交叉应用进行查询,尝试基于属性值获取字段_Sql Server_Xml_Sql Server 2012_Xml Attribute - Fatal编程技术网

Sql server 使用交叉应用进行查询,尝试基于属性值获取字段

Sql server 使用交叉应用进行查询,尝试基于属性值获取字段,sql-server,xml,sql-server-2012,xml-attribute,Sql Server,Xml,Sql Server 2012,Xml Attribute,我尝试根据属性(区域性)的值,从SQL Server中存储为XML的表单中获取所有字段名。实际上,我可以得到文本值,但它们被连接到FieldName列中 XML结构如下所示: <Form> <Field> <Field Name="email" Type="text" ColumnSize="6"> <Localizations> <Localization Culture="fr">

我尝试根据属性(区域性)的值,从SQL Server中存储为XML的表单中获取所有字段名。实际上,我可以得到文本值,但它们被连接到FieldName列中

XML结构如下所示:

<Form>
  <Field>
    <Field Name="email" Type="text" ColumnSize="6">
      <Localizations>
        <Localization Culture="fr">
          <Text>Adresse couriel</Text>
          <Placeholder>Entrez votre adresse courriel</Placeholder>
        </Localization>
        <Localization Culture="fr">
          <Text>Email</Text>
          <Placeholder>Enter your email</Placeholder>
        </Localization>
      </Localizations>
    </Field>
  </Fields>
</Form>
结果如下所示:

FieldUniqueName  |  FieldName             | FieldType
name             |  Nom Name              | text
email            |  Adresse couriel Email | text
phone            |  Téléphone Phone Number| text
两种语言都在FieldName列中

我也尝试过:

...
c.value('data(./Localizations/Localization/Text)[1]', 'VARCHAR(100)') AS FieldName,
...

但是我需要在
[1]
[2]
之间进行选择以获得正确的语言…

好的,我找到了对我的问题的答案!我没有使用where子句,而是更改了字段名的XPath。工作起来很有魅力:

DECLARE @language VARCHAR(2)
SET @language = 'en'
SELECT 
    c.query('data(@Name)') AS FieldUniqueName, 
    c.query('data(./Localizations/Localization[@Culture=sql:variable("@language")]/Text)') AS FieldName, 
    c.query('data(@Type)') AS FieldType
FROM dbo.Form Form CROSS APPLY FormContent.nodes('/Form/Fields/Field') x(c)
WHERE Id = @formId

除此之外,您提供的XML(结构和“fr”都有)中还存在一些错误,您可以尝试以下方法:

DECLARE @tbl TABLE(ID INT IDENTITY, FormContent XML);
INSERT INTO @tbl VALUES
(N'<Form>
  <Fields>
    <Field Name="email" Type="text" ColumnSize="6">
      <Localizations>
        <Localization Culture="fr">
          <Text>Adresse couriel</Text>
          <Placeholder>Entrez votre adresse courriel</Placeholder>
        </Localization>
        <Localization Culture="en">
          <Text>Email</Text>
          <Placeholder>Enter your email</Placeholder>
        </Localization>
      </Localizations>
    </Field>
  </Fields>
</Form>');

前一个WHERE子句将只检查这个条件是否已满——在XML中的某个地方。嗯,是。。。但是在这里使用
data()
是不对的。。。最好将该条件打包到第二个
.nodes()
调用中,作为
XQuery谓词
我将尝试一下,如果它满足我的要求,请标记您的答案。谢谢
DECLARE @tbl TABLE(ID INT IDENTITY, FormContent XML);
INSERT INTO @tbl VALUES
(N'<Form>
  <Fields>
    <Field Name="email" Type="text" ColumnSize="6">
      <Localizations>
        <Localization Culture="fr">
          <Text>Adresse couriel</Text>
          <Placeholder>Entrez votre adresse courriel</Placeholder>
        </Localization>
        <Localization Culture="en">
          <Text>Email</Text>
          <Placeholder>Enter your email</Placeholder>
        </Localization>
      </Localizations>
    </Field>
  </Fields>
</Form>');
DECLARE @language VARCHAR(2)
SET @language = 'en'
SELECT 
    fld.value(N'@Name',N'nvarchar(max)') AS FieldUniqueName, 
    fld.value(N'@Type',N'nvarchar(max)') AS FieldType, 
    loc.value(N'(Text/text())[1]','nvarchar(max)') AS LocalText, 
    loc.value(N'(Placeholder/text())[1]','nvarchar(max)') AS LocalPlaceholder
FROM @tbl Form 
CROSS APPLY FormContent.nodes(N'/Form/Fields/Field') AS A(fld)
CROSS APPLY A.fld.nodes(N'Localizations/Localization[@Culture=sql:variable("@language")]') B(loc)
WHERE Id = 1