SQL查询,仅选择并替换一个列值,而不定义其他列

SQL查询,仅选择并替换一个列值,而不定义其他列,sql,sql-server,Sql,Sql Server,我需要执行select,但我需要替换一列的值out。这个表有25列,我想让它可读,不需要列出所有列来替换另一个表中的一列。这就是我所做的工作 SELECT * INTO #temp_grouping FROM [ae_p_phs_e] WHERE [template_id] = '1010' AND [status_code] = 'OPEN' AND [shop] = 'SP-STEAM' -- select row from the temp table for ins

我需要执行select,但我需要替换一列的值out。这个表有25列,我想让它可读,不需要列出所有列来替换另一个表中的一列。这就是我所做的工作

SELECT *  
INTO #temp_grouping
FROM [ae_p_phs_e]
WHERE [template_id] = '1010'
    AND [status_code] = 'OPEN'
    AND [shop] = 'SP-STEAM'

-- select row from the temp table for inserting
UPDATE #temp_grouping
SET 
    [description] = [source_data].[description]
FROM 
    [ae_a_asset_e] AS [source_data]
WHERE 
    [source_data].[asset_tag] = [#temp_grouping].[asset_tag]
    AND [source_data].[multitenant_id] = [#temp_grouping].[multitenant_id]

SELECT *
FROM #temp_grouping

--drop the temp table
DROP TABLE #temp_grouping
但是,还有什么其他方法可以做同样的事情呢

样品 第一个表A上的数据返回示例

1,2017-026221,001,BAD description,..... VERY LAST
1,2017-026221,002,BAD description,..... VERY LAST
1,2017-026221,003,BAD description,..... VERY LAST
1,2017-026221,004,BAD description,..... VERY LAST
1,2017-026221,005,BAD description,..... VERY LAST
第一个表B上的数据返回示例

1,null,XX1,GOOD description,..... VERY LAST
1,null,XX2,GOOD description,..... VERY LAST
1,null,XX3,GOOD description,..... VERY LAST
1,null,XX4,GOOD description,..... VERY LAST
1,null,XX5,GOOD description,..... VERY LAST
示例返回数据返回,基本上是第一个表A,表B上有一个值

1,2017-026221,001,GOOD description,..... VERY LAST
1,2017-026221,002,GOOD description,..... VERY LAST
1,2017-026221,003,GOOD description,..... VERY LAST
1,2017-026221,004,GOOD description,..... VERY LAST
1,2017-026221,005,GOOD description,..... VERY LAST
假定
  • scripttable As
    是一种自动填充列的解决方案,但不适合这种需要。问题的解决办法 问题不应包括与问题要求相反的内容 不列出标题中所述的列
  • 在许多情况下,不允许使用需要授权才能读取系统表的解决方案
到目前为止的解决方案
听起来似乎答案是,如果不列出所有列,可能没有其他方法可以完成我所做的事情。如果结果不是这样,那么我将删除此部分。

这是使用动态查询执行此操作的唯一方法

declare @query nvarchar(max) = ''
declare @temp_grouping nvarchar(max) = 'col1, col2, col3'
set @query = 'SELECT  '+@temp_grouping+' FROM [ae_p_phs_e] where [template_id] = ''1010'''
print @query
exec sp_executesql @query

恐怕你的评论并没有真正阐明我想弄清楚的是什么,但让我根据我猜你想做的事情提出一个解决方案。事实上,基于两种猜测,我有两种解决方案:

  • 您希望从包含大量列的表中写入SELECT,因此您希望避免键入所有列名,原因无非是这将需要大量键入。但不能进行简单的SELECT*,因为输出中有一列要替换为另一个表中的列
  • 解决方案:在SSMS对象资源管理器窗格中的表上单击鼠标右键,然后选择“将表作为脚本>选择到>新建查询窗口”

    您将获得一个新的查询窗口,其中写入了SELECT查询,并为您写入了所有列名。不需要打字。然后,只需使用所需的联接修改该查询,并在选择列表中找到要替换的列,然后将其替换为联接表中的列。这将临时生成所需的SELECT查询

  • 您有一个更为流动的情况,无论出于何种原因,您不一定知道列将是什么,因此您不能硬编码列列表,但您知道如果出现某个列,您希望用另一个列替换它

  • 解决方案:使用动态sql查询,如Rainman答案中的查询。您可以通过查询系统表来动态生成该列表,而不是像您在对其答案的评论中提到的那样键入列列表,以获取属于您感兴趣的表的所有列。

    示例数据和所需结果将真正帮助解释您所做的。@GordonLinoff i更新,请让我知道这是否会清除它。您是在要求避免键入所有列名,还是有其他好的理由更喜欢使用
    SELECT*
    而不是显式列列表?让我们假设有50列,我是在避免键入:D。。基本的需要是超级100%清楚地告诉数据库中的其他所有人正在发生什么,这是一种很容易迷失在传统选择的混乱列中的方式。更重要的是,它将被插入到其他一些东西中,所以我只是在寻找一种不同的方式来写我所做的事情,而不列出每一个专栏。希望这能把事情弄清楚。我所做的一切都很好,但我希望有些东西可能更“原生”,如果您使用的是SQLServerManagementStudio,您可以选择您的查询,使用*,右键单击它并选择“在编辑器中设计查询”。将在设计器中选择所有列。单击“确定”,您的*将被替换为您所有的列名,而无需手动键入。您可以在不使用动态SQL的情况下执行此操作吗?不幸的是,您不能。在这一行
    @temp\u grouping nvarchar(max)='col1,col2,col3'
    我是否不必列出所有25列?哦,我想如果我可以写出上面的内容,我想很明显,我知道如何右键单击以及如何使用连接……)那里一切都很有趣。问题不在于我是否可以用所有的列填充屏幕。
    declare @query nvarchar(max) = ''
    declare @temp_grouping nvarchar(max) = 'col1, col2, col3'
    set @query = 'SELECT  '+@temp_grouping+' FROM [ae_p_phs_e] where [template_id] = ''1010'''
    print @query
    exec sp_executesql @query