此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是由我组织中的某人编写的,但现在没有人知道它是如何工作的。
此代码将数据从一个表复制到另一个表。源表和目标表位于不同的数据库中。
我的问题是,它会复制与列名匹配的数据还是直接将其复制过来?
答案 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 $”的表的列列表,该表似乎是由运行时环境(用于运行脚本),然后返回可以粘贴到查询窗口中并运行以从该表中选择所有列的字符串。
这是从