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_Select_Sql Server 2008 R2 - Fatal编程技术网

Sql server 用于定义选择列表的子查询

Sql server 用于定义选择列表的子查询,sql-server,select,sql-server-2008-r2,Sql Server,Select,Sql Server 2008 R2,我想使用“子查询”来定义要选择的表列。 Fields表FieldName列包含EDIFields表的列名以及其他列名 类似于以下内容: SELECT ( SELECT FieldName FROM FieldsTable ft WHERE ft.FormatID = @FormatID AND ft.Active != 0 ) From EDIFields Where ... 是否可以在sql server 2008 r2中执行

我想使用“子查询”来定义要选择的表列。 Fields表FieldName列包含EDIFields表的列名以及其他列名

类似于以下内容:

SELECT ( SELECT FieldName 
         FROM FieldsTable ft 
         WHERE ft.FormatID = @FormatID 
           AND ft.Active != 0 ) 
From EDIFields
Where ...
是否可以在sql server 2008 r2中执行此操作,或者可以通过其他方式获得所需的结果

示例输出:

@Active = 1
@FormatID = 1
PONUM  QTY
PO1    1
PO2    3
PO3    2

@Active = 1
@FormatID = 2
PONUM  TRANSID  MSG
PO1    T1       msg1
PO2    T1       msg2
PO3    T2       msg3

@Active = 1
@FormatID = 3    
TOTAL
56.65
67.43
100
初始表格如下:

电子数据字段-

PONUM   TRANSID QTY MSG TOTAL
PO1     T1          1   msg1    56.65
PO2     T1          3   msg2    67.43
PO3     T2          2   msg3    100
字段-

FIELDID FIELDNAME   FORMATID   ACTIVE
1           PONum           1      1
2           TransID         1      0
3           Qty             1      1
4           PONum           2      1
5           TransID         2      1
6           Msg             2      1
7           Total           3      1

以下是存储过程-

Create  procedure getResults(
@Active int,
@FormatID int
)
AS
BEGIN
Declare @srcTable nvarchar(100)
Declare @ColumnList nvarchar(max)
Declare @sqlCmd nvarchar(max)
Set @srcTable = 'EDIFields'
Set @ColumnList = ''
Set @sqlCmd = 'SELECT '
-- Get the field list as a comma separated value
Select @ColumnList =  @ColumnList + fieldName + ','
from fields
where (formatId = @FormatID and active = @Active) 
-- Remove comma from last position of columnList
Set @ColumnList = LEFT(@ColumnList, LEN(@ColumnList) - 1)
-- Now add these columns to the sqlCmd
Set @sqlCmd = @sqlCmd + @ColumnList + ' FROM ' + @srcTable
-- Now your sql statement is ready to be executed
exec sp_executesql @sqlCmd
END

我认为唯一的方法是构建一个动态SQL语句

     DECLARE @SQL as nvarchar(MAX)
DECLARE @COLUMNLIST as nvarchar(MAX)

SELECT @COLUMNLIST = coalesce(@COLUMNLIST +',', '') + '[' + FieldName + ']'  
         FROM FieldsTable ft 
         WHERE ft.FormatID = @FormatID 
           AND ft.Active != 0

set @SQL =  'select ' +  @COLUMNLIST + ' FROM EDIFields'
exec sp_executesql @SQL

您好,您期望的输出是什么?我在sqlfiddle中有这个,但我会复制并粘贴到编辑中。复制粘贴输出,而不是代码。所以您需要三个查询才能获得三个输出?不,对不起,我不清楚。采用
@Active
@FormatID
并返回单个结果集的SP。
@Active
@FormatID
确定在该结果集中返回哪些列。这些示例就好像您使用给定的输入分别运行了SP三次。帮助我将列转换为CSV的关键帖子-示例执行-
exec getResults 1,1
。我希望你喜欢!很好。我喜欢!顺便说一句,我不使用任何类似于
合并的函数。这也很有效,但我只能接受一个答案。太棒了,我很高兴它很有用:-)它一直是我最喜欢的查询。。。最初我是从皮纳尔·戴夫那里得到这个问题的。Pinal通常是我得到95%的SQL问题答案的地方。