2013-04-08 98 views
2

Doc表包含了很多列(即使不使用的):如何在SQL中选择XML路径查询的输出?

Doc_DdfID Doc_RentDate Doc_ReturnDate etc. 
--------- ------------ -------------- ---- 
1   2012-07-28 2012-07-28 

但我想查询刚刚Doc的表内使用的。

DocDefinitionFields列表columsn正在使用的文件:

SELECT Dfl_ColName 
FROM DocDefinitionFields 
WHERE Dfl_DdfID = 1 

DocDefinitionFields

Dfl_ColName 
----------- 
Doc_RentDate 
Doc_ReturnDate 
........... 

所以我想从Doc表中选择所有的列(由第二个查询列出)。

(如果增加2列到文档定义形式我想选择只是其中):

文件

Doc_RentDate Doc_ReturnDate 
------------ -------------- 
2012-07-28 2012-07-28 

试图通过subquerying选择具有的连接来做到这一点使用XML路径的字段:

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

这不是那么简单的寿。你有什么建议?

+0

你可以发表你想要的结果的例子?此外,您正在使用的SQL Server版本。 – Lamak 2013-04-08 21:04:37

+0

发布,使用SQL Server 2008 R2。 – netdis 2013-04-08 21:11:59

回答

2

你所需要的就是动态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一起加入STUFF功能栏的末尾附加逗号(,)。

1

要动态获取查询的列名并在查询中使用它们,您将需要使用Dynamic SQL。下面是如何创建可用列

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 

你应该可以修改上述内容以提供你所需要的。

我希望这会有所帮助。

+1

谢谢,也:) – netdis 2013-04-08 21:58:20