我以前使用以下格式插入我的mysql数据库,并希望保持统一。
INSERT INTO OPENQUERY (ENET, 'SELECT * FROM ActiveDirectory.Computers') -- MYSQL database
SELECT c.[CommonName],
c.[DistinguishedName],
c.[SAMAccountName],
c.[DNSHostName],
c.[Location],
c.[Division],
c.[Department],
c.[ManagedBy],
c.[MachineRole],
CAST(CAST(c.[LastLogon] as timestamp) as datetime) AS LastLogon,
c.[OperatingSystem],
c.[OperatingSystemVersion],
c.[ServicePack],
c.[OU],
c.[CreatedOn],
c.[ChangedOn],
CASE WHEN c.[UserAccountControl] & 2 = 0 THEN 1 ELSE 0 END AS [Enabled] -- Check to see if disabled. Disabled = bitwise of 2; 4098 = 4096 + 2 = Trust Account + Disabled
FROM [IT_ActiveDirectory].[dbo].[ADComputerTable] c -- MSSQL database
在将MSSQL(c.LastLogon, c.CreatedOn, c.ChangedOn
)中的日期时间字段插入到也是日期时间的mysql字段时出现问题。我几乎尝试了CAST()
和CONVERT()
的所有组合,但我可能错过了一些东西。我也尝试将mysql的字段类型更改为时间戳。
返回:Conversion failed when converting date and/or time from character string.
对我来说,MSSQL不仅会将数据发送到MYSQL并让它进行转换,这似乎很奇怪。相反,在将数据类型和数据发送到MYSQL之前,它似乎正在尝试转换和匹配数据类型和数据。
如果我不能以这种方式插入它,我会接受另一种格式,比如它是否可以在OPENQUERY() SELECT
内插入。有什么建议?我此刻已经死在水中了。
答案 0 :(得分:0)
我会尝试转换为ISO-8601格式字符串:
INSERT INTO OPENQUERY (ENET, 'SELECT * FROM ActiveDirectory.Computers')
SELECT
...,
CONVERT(VARCHAR, LastLogon, 126) AS LastLogon
FROM [IT_ActiveDirectory].[dbo].[ADComputerTable];
我也不喜欢SELECT *
中的OPENQUERY
。如果列按位置匹配,则容易出错。考虑将开始扩展到列。