我正试图在两张大表( 600多列)上执行联合操作。两个表中的所有变量都应该具有相同的格式,但它们是由两个不同的团队单独准备的。
SELECT * into #FINAL_TABLE
from
(select * from Table1
UNION
select * FROM Table2 ) as tmp
我得到一个错误,其中包括一列中有关数据类型错误的信息:
Msg 8114,16级,状态5,线路600
将数据类型nvarchar转换为数字时出错。
基于这个错误,我不能说:
是否有更有效的方法来识别所有导致日期类型错配错误的列,然后逐列检查?
发布于 2021-06-30 02:03:52
此查询应识别两个表之间的数据类型不匹配。
SELECT
IST1.COLUMN_NAME as Table1_column
,IST1.DATA_TYPE as Table1_datatype
,IST2.COLUMN_NAME as Table2_column
,IST2.DATA_TYPE as Table2_datatype
FROM information_schema.columns IST1
INNER JOIN information_schema.columns IST2
ON IST1.ORDINAL_POSITION=IST2.ORDINAL_POSITION
WHERE IST1.table_name='Table1' AND IST1.TABLE_SCHEMA='dbo'
AND IST2.table_name='Table2' AND IST2.TABLE_SCHEMA='dbo'
AND IST1.DATA_TYPE <> IST2.DATA_TYPE
发布于 2021-06-30 02:02:49
您可以这样做,这将返回数据类型不一致的表名和列名。但评论中的要点确实站得住脚:
应该在SELECT *
SELECT *
UNION
数据时。
另外,如果您正在合并数据,我怀疑您需要的是UNION ALL
,而不是UNION
。我怀疑你的任何行在这里都是重复的,因为:
无论如何,一种方法是使用dm_exec_describe_first_result_set
获取返回结果集的详细信息,然后从两个结果集比较位于相同序号位置的列的数据类型。
SELECT T1.[name] AS Table1Column,
T1.system_type_name AS Table1Type,
T2.[name] AS Table2Column,
T2.system_type_name AS Table2Type
FROM sys.dm_exec_describe_first_result_set(N'SELECT * FROM Table1;',NULL,NULL) T1
JOIN sys.dm_exec_describe_first_result_set(N'SELECT * FROM dbo.Table2;',NULL,NULL) T2 ON T1.column_ordinal = T2.column_ordinal
WHERE T1.system_type_id <> T2.system_type_id;
发布于 2021-06-30 07:19:43
对于SQL 2017及以上版本:
DECLARE @SomeString varchar(100) = 'ABC_DEF_GHI_jkl';
WITH T0 AS
(
SELECT 1 AS INDICE,
SUBSTRING(@SomeString, 1, 1) AS RAW_LETTER,
SUBSTRING(UPPER(@SomeString), 1, 1) AS UP_LETTER
UNION ALL
SELECT INDICE + 1,
SUBSTRING(@SomeString, INDICE + 1, 1) AS RAW_LETTER,
SUBSTRING(UPPER(@SomeString), INDICE + 1, 1)
FROM T0
WHERE INDICE < LEN(@SomeString)
)
SELECT STRING_AGG(RAW_LETTER, '') WITHIN GROUP (ORDER BY INDICE)
FROM T0
WHERE RAW_LETTER COLLATE Latin1_General_BIN = UP_LETTER;
对于2017年之前的Server:
WITH T0 AS
(
SELECT 1 AS INDICE,
SUBSTRING(@SomeString, 1, 1) AS RAW_LETTER,
SUBSTRING(UPPER(@SomeString), 1, 1) AS UP_LETTER
UNION ALL
SELECT INDICE + 1,
SUBSTRING(@SomeString, INDICE + 1, 1) AS RAW_LETTER,
SUBSTRING(UPPER(@SomeString), INDICE + 1, 1)
FROM T0
WHERE INDICE < LEN(@SomeString)
)
SELECT STUFF((SELECT '' + RAW_LETTER
FROM T0
WHERE RAW_LETTER COLLATE Latin1_General_BIN = UP_LETTER
FOR XML PATH('')), 1, 0, '');
https://stackoverflow.com/questions/68192361
复制相似问题