Tsql 从join语句中获取字段名(展开*star)

Tsql 从join语句中获取字段名(展开*star),tsql,ssms,Tsql,Ssms,最近,我在临时查询中构建了相当长的联接,我发现一旦联接起作用,就在select语句中键入所有字段名是非常乏味的。有没有一种快速的方法可以列出组合查询中的所有字段名?是否需要对select语句或key命令执行某些查询 例如,下面的连接中可能有大约30个字段。如果我能从“*”星上得到一个快速扩展的列表,那么我就可以拿走我不需要的东西 SELECT * FROM [DB].[THINGS].[QLINKS] Q JOIN [DB].[THINGS].[POINTS] RQ ON Q.ID =

最近,我在临时查询中构建了相当长的联接,我发现一旦联接起作用,就在select语句中键入所有字段名是非常乏味的。有没有一种快速的方法可以列出组合查询中的所有字段名?是否需要对select语句或key命令执行某些查询

例如,下面的连接中可能有大约30个字段。如果我能从“*”星上得到一个快速扩展的列表,那么我就可以拿走我不需要的东西

SELECT *
FROM [DB].[THINGS].[QLINKS] Q
JOIN [DB].[THINGS].[POINTS] RQ
    ON Q.ID = RQ.POINT_ID
JOIN [DB].[THINGS].[REFERENCES] R
    ON RQ.POINT_ID = R.ID
JOIN SA_MEMBERSHIP.DBO.ASPNET_USERS U
    ON U.USERID = R.PERSON_ID
JOIN SA_MEMBERSHIP.DBO.ASPNET_MEMBERSHIP M
    ON M.USERID = U.USERID
WHERE NOT Q.ID IN (
        SELECT RQ.QLINK_ID
        FROM [DB].[DATA].[ENTRIES] E
        JOIN [DB].[THINGS].[REFERENCES] R
            ON E.PERSON_ID = R.PERSON_ID
        JOIN [DB].[THINGS].[POINTS] RQ
            ON R.ID = RQ.POINT_ID
        WHERE (
                ITEMKEY LIKE '102_0%'
                OR ITEMKEY LIKE '104_0%'
                )
            AND E.POINT_ID IS NULL
        GROUP BY E.PERSON_ID, LEFT(ITEMKEY, 5), R.ID, RQ.QLINK_ID
        )

类似于以下内容(tsql版本,其思想是使用结果集的元数据),游标c是您的查询

declare c cursor for select * from sys.databases
go
open c


DECLARE @Report CURSOR;
declare @cn sysname
declare @op int
declare @ccf int
declare @cs int
declare @dts smallint
declare @cp tinyint
declare @colsc tinyint
declare @orp int
declare @od varchar(1)
declare @hc smallint
declare @cid int
declare @oid int
declare @dbid int
declare @dbn sysname

exec sp_describe_cursor_columns @cursor_return = @Report out, @cursor_source = N'global', @cursor_identity = N'c';

declare @res nvarchar(max)
set @res = '';

FETCH NEXT from @Report into @cn, @op, @ccf, @cs, @dts, @cp, @colsc, @orp, @od, @hc, @cid, @oid, @dbid, @dbn;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
    set @res = @res +',' + @cn
   FETCH NEXT from @Report into @cn, @op, @ccf, @cs, @dts, @cp, @colsc, @orp, @od, @hc, @cid, @oid, @dbid, @dbn;
END

print stuff(@res, 1, 1, '')

CLOSE @Report;
DEALLOCATE @Report;
GO

close c
deallocate c
为sys.databases中的select*声明c游标
去
开c
声明@Report游标;
声明@cn sysname
声明@op int
声明@ccf int
声明@cs int
声明@dts smallint
声明@cp tinyint
声明@colsc tinyint
声明@orp int
声明@od varchar(1)
声明@hc smallint
声明@cid int
声明@oid int
声明@dbid int
声明@dbn sysname
exec sp_description_cursor_columns@cursor_return=@Report out、@cursor_source=N'global'、@cursor_identity=N'c';
声明@res nvarchar(最大值)
设置@res='';
将下一个从@Report获取到@cn、@op、@ccf、@cs、@dts、@cp、@colsc、@orp、@od、@hc、@cid、@oid、@dbid、@dbn;
WHILE(@@FETCH\u状态-1)
开始
设置@res=@res+','+@cn
将下一个从@Report获取到@cn、@op、@ccf、@cs、@dts、@cp、@colsc、@orp、@od、@hc、@cid、@oid、@dbid、@dbn;
结束
打印内容(@res,1,1,,)
关闭@报告;
取消分配@报告;
去
关闭c
解除分配c

原来有一个插件可以实现这一点!插件ApexSQL重构免费提供此功能

此处直接链接:


尊敬的皮纳尔·戴夫(Pinal Dave)在这里描述:

列出字段的意义在于,您可能不需要所有字段。@JoelCoehoorn我同意您的观点,问题是,有时候,删除一些字段比添加很多字段更容易。好吧,这很酷。但它并没有提供桌子作为一块。例如,RQ.field1,Q.field1…@mcfea应该可以帮助你做到这一点。好吧,我希望有更多的“右键点击”,但这回答了我的问题。泰!