此SQL的作用是什么?

时间:2018-07-27 07:21:27

标签: sql sql-server

此SQL的作用是什么?

DECLARE @s VARCHAR(MAX)

SELECT @S =  ISNULL( @S + ',' ,' ') + c.name
FROM  sys.all_columns c
JOIN  sys.tables      t  ON  c.object_id = t.object_id 
WHERE t.name = '$DestinationTable$'

SELECT 'SELECT ' + @S + ' FROM $SourceTable$'

此sql是由我组织中的某人编写的,但现在没有人知道它是如何工作的。

此代码将数据从一个表复制到另一个表。源表和目标表位于不同的数据库中。

我的问题是,它会复制与列名匹配的数据还是直接将其复制过来?

4 个答案:

答案 0 :(得分:1)

为什么不尝试打印@S变量并查看其作用?

我使用以下表格对其进行了测试,以进行说明:

CREATE TABLE [dbo].[Source](
    [BudgetID] [int] NULL,
    [RecordID] [int] NULL,
    [BDate] [date] NULL,
    [Percentage] [int] NULL,
    [Status] [varchar](50) NULL
)


CREATE TABLE [dbo].[Destination](
    [BudgetID] [int] NULL,
    [RecordID] [int] NULL,
    [BDate] [date] NULL,
    [Percentage] [int] NULL,
    [Status] [varchar](50) NULL
)

并用这些表名替换变量/参数:

DECLARE @s VARCHAR(MAX)  

SELECT @S =  ISNULL( @S + ',' ,' ') +   c.name   
FROM  sys.all_columns c  join sys.tables  t  ON  c.object_id = t.object_id 
WHERE t.name = 'Destination'

SELECT 'SELECT ' + @S + ' FROM  Source'

结果:

SELECT BudgetID,RecordID,BDate,Percentage,Status FROM  Source

如您所见,它从目标表中获取所有列,以便使用源表中的所有那些列构建一个选择字符串。 (如果目标表缺少源表具有的某些列,可能不会引起任何问题。)

答案 1 :(得分:0)

它从系统表中获取所有表的列,并使用提到的列名创建SELECT查询。

SELECT * FROM TABLENAME  

以这种方式编写查询是一种不好的做法。

根据规则,您需要指定列。并且该查询针对给定的表名返回正确的Select语句。

答案 2 :(得分:0)

此语句使用架构存储库动态创建名为“ $ DestinationTable $”的表的列列表,该表似乎是由运行时环境(用于运行脚本),然后返回可以粘贴到查询窗口中并运行以从该表中选择所有列的字符串。

这是从

脚本获取SELECT <每列>的便捷工具。 该脚本本身不会复制或插入任何内容。

答案 3 :(得分:0)

在此查询中,变量@s将包含$DestinationTable$的所有列名 只需尝试打印变量@s即可知道其包含的所有列。最好显式地写入列名,因为此查询会增加查找表名的开销。