Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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

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中选择XML路径查询的输出?_Sql_Sql Server_Tsql_Sql Server 2008 R2 - Fatal编程技术网

如何在SQL中选择XML路径查询的输出?

如何在SQL中选择XML路径查询的输出?,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,Doc表包含许多列(即使未使用): 但是我只想查询Doc表中使用的那些 DocDefinitionFields列出文档正在使用的列: SELECT Dfl_ColName FROM DocDefinitionFields WHERE Dfl_DdfID = 1 文档定义字段: Dfl_ColName ----------- Doc_RentDate Doc_ReturnDate ........... 所以我想从Doc表中选择所有列(通过第二次查询列出) 示例(如果文档定义表单中添加了两

Doc
表包含许多列(即使未使用):

但是我只想查询
Doc
表中使用的那些

DocDefinitionFields
列出文档正在使用的列:

SELECT Dfl_ColName 
FROM DocDefinitionFields 
WHERE Dfl_DdfID = 1
文档定义字段

Dfl_ColName
-----------
Doc_RentDate
Doc_ReturnDate
...........
所以我想从
Doc
表中选择所有列(通过第二次查询列出)

示例(如果文档定义表单中添加了两列,我只想选择它们):

文件

Doc_RentDate Doc_ReturnDate
------------ --------------
2012-07-28   2012-07-28
尝试通过子查询select并使用XML PATH连接字段来执行此操作:

SELECT 
   (SELECT 
       Dfl_ColName + ', ' 
       FROM DocDefinitionFields 
       FOR XML PATH('') 
   ) 
FROM Doc

没那么简单。您有什么建议?

这里您需要的是动态SQL,类似于:

DECLARE @sql VARCHAR(MAX)

SET @sql = 'SELECT ' + STUFF((SELECT ', ' + Dfl_ColName FROM DocDefinitionFields FOR XML PATH('') ),1,1,'') + ' FROM Doc'

EXEC (@sql)

另外,为了消除列末尾额外的逗号(,),我在FOR XML PATH中添加了填充函数。

要动态获取查询的列名并在查询中使用它们,您需要使用。下面是如何创建可用列字符串的示例

DECLARE @Columns VARCHAR(MAX);
SELECT @Columns =  
    COALESCE(@Columns + ', 
     [' + CAST(COLUMN_NAME AS VARCHAR) + ']',
    '[' + CAST(COLUMN_NAME AS VARCHAR) + ']') 
FROM (SELECT DISTINCT COLUMN_NAME  
      FROM [SomeDatabase].INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME = N'SomeTableName') AS H
ORDER BY COLUMN_NAME;
GO
现在可以在动态SQL查询中使用可用列的字符串。在下面的
INSERT
查询中,我们采用了上述方法,动态构建所需字段。我们需要在下面这样做的原因是集合字段
SomeFieldA
与其他字段一起包含

DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 
N'INSERT INTO [' + @DbName + N']..[SomeOtherTable] ([SomeFieldA], ' + @Columns + N')  
  SELECT SomeFieldA, ' + @Columns + N' 
  FROM [SomeTableName];';
EXEC sp_executesql @SQL; 
GO
您应该能够修改上述内容,以提供您需要的内容


我希望这能有所帮助。

你能举一个你想要的结果的例子吗?。另外,您正在使用的SQL Server版本。已发布,使用SQL Server 2008 R2。
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 
N'INSERT INTO [' + @DbName + N']..[SomeOtherTable] ([SomeFieldA], ' + @Columns + N')  
  SELECT SomeFieldA, ' + @Columns + N' 
  FROM [SomeTableName];';
EXEC sp_executesql @SQL; 
GO