2

Doc表包含很多列(甚至未使用的列):

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

但我只想查询Doc's 表中使用过的那些。

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

SELECT Dfl_ColName 
FROM DocDefinitionFields 
WHERE Dfl_DdfID = 1

文档定义字段

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

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

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

文件

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

尝试通过使用 XML PATH 对带有字段连接的子查询进行子查询来做到这一点:

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

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

4

2 回答 2

2

您需要的是动态 SQL,如下所示:

DECLARE @sql VARCHAR(MAX)

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

EXEC (@sql)

此外,为了消除列末尾的额外逗号(,),我添加了 STUFF 函数以及 FOR XML PATH。

于 2013-04-08T21:18:20.253 回答
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动态构建所需字段的查询中采用了上述内容。我们需要在下面这样做的原因是包含 set 字段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

您应该能够修改上述内容以提供您需要的内容。

我希望这有帮助。

于 2013-04-08T21:21:15.157 回答