Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL INSERT使用列具有不同数据类型的表并在转换时出错_Sql Server_Tsql_Insert - Fatal编程技术网

Sql server SQL INSERT使用列具有不同数据类型的表并在转换时出错

Sql server SQL INSERT使用列具有不同数据类型的表并在转换时出错,sql-server,tsql,insert,Sql Server,Tsql,Insert,我有两张表,我想从一张插入另一张。在我的staging(source)表中,每一列都被定义为nvarchar(300),此限制不能更改 在我的目标表中,列具有所有不同的类型。例如,如果我想从源表中选择(数据类型nvarchar(300)),并将该列插入到decimal(28,16)的数据类型中 发生这种情况时,我会出现以下错误: 将数据类型nvarchar转换为数字时出错 即使在我使用强制转换时,也会出现错误 INSERT INTO Destination ( Weighting ) V

我有两张表,我想从一张插入另一张。在我的staging(source)表中,每一列都被定义为
nvarchar(300)
,此限制不能更改

在我的目标表中,列具有所有不同的类型。例如,如果我想从源表中选择(数据类型
nvarchar(300)
),并将该列插入到
decimal(28,16)
的数据类型中

发生这种情况时,我会出现以下错误:

将数据类型nvarchar转换为数字时出错

即使在我使用强制转换时,也会出现错误

INSERT INTO Destination (
    Weighting
)
VALUES (
    CAST(src.Weighting AS decimal(28, 16))
)
null
值是否会影响这一点?还有什么要考虑的吗?

INSERT INTO Destination (Weighting)
SELECT CAST(src.Weighting AS decimal(28, 16))
  FROM [Source] src
如果varchar值的格式正确,应该可以正常工作。 如果错误仍然发生,请给出正在转换的值的示例


空值将成功转换为空值。

这将搜索非数字字符串


从src中选择src.Weighting,其中isnumeric(src.Weighting)=0

如果暂存表列中的所有数据都可以隐式转换为目标数据类型,则不必设置显式强制转换

但是,如果任何一个值不能被隐式转换(即,一个单元格包含非数字或格式错误的字符串值,该字符串值应以
十进制
类型列结尾),则整个事务将失败

您可以通过如下设置插入来转移交易失败的风险:

INSERT
  LiveTable (
    VarcharCol,
    DecimalCol,
    NonNullableCol
  )
SELECT
  NvarcharCol1,
  CASE ISNUMERIC(nvarcharCol2) = 0 THEN NvarcharColl2 END,
  ISNULL(NvarcharCol3, '')
FROM
  StagingTable
但很明显,这意味着可能会丢失相关数据或数字精度

您可以阅读MSDN(向下滚动至矩阵)。对于所有其他转换,您必须使用
CAST
CONVERT

TSQL将数据转换为您想要的类型。如果源中的数据类型与您试图将其存储为目标表中的数据类型以及目标表规范中的数据类型完全相同,则不会有太多问题

如果你有一列数字,其中一列是“三”而不是“3”,那么它会变得复杂。是一个关于将varchar转换为十进制的问题

例如:我可以将123转换为varchar(20),然后在适当的时候将varchar转换为十进制,没有问题

SELECT cast(cast('123' as varchar(20)) as decimal(8,2))
但是,如果我试图转换一个字符,它将给出一个错误

SELECT cast(cast('1a3' as varchar(20)) as decimal(8,2))

空值只有在目标列不允许空值时才有问题,我认为问题在于格式字符串不能始终转换为十进制,请查看十进制分隔符是否是逗号而不是点。

您确定它是可以强制转换的字符串吗?测试是数值的。这很有帮助-我在查询中的所有列上运行了它。结果显示,
Weighting
在列中的值为
parent
。谢谢。然后在插入中添加一个where isnumeric(src.Weighting)=1,用于可转换的值。