Sql server 用于定义选择列表的子查询
我想使用“子查询”来定义要选择的表列。 Fields表FieldName列包含EDIFields表的列名以及其他列名 类似于以下内容: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中执行
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问题答案的地方。