1

我有两张桌子,我想从一张桌子插入另一张桌子。在我的暂存(源)表中,每一列都定义为nvarchar(300),并且此限制不能更改。

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

发生这种情况时,我收到以下错误:

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

即使我使用演员表,我也会得到错误。

INSERT INTO Destination (
    Weighting
)
VALUES (
    CAST(src.Weighting AS decimal(28, 16))
)

null价值观会影响到这一点吗?还有什么要考虑的吗?

4

5 回答 5

1

这将搜索非数字字符串

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

于 2012-12-18T15:26:22.320 回答
1

如果您的临时表列中的所有数据都可以隐式转换为目标数据类型,那么您不必设置显式转换。

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

您可以通过像这样设置插入来迁移失败事务的风险:

INSERT
  LiveTable (
    VarcharCol,
    DecimalCol,
    NonNullableCol
  )
SELECT
  NvarcharCol1,
  CASE ISNUMERIC(nvarcharCol2) = 0 THEN NvarcharColl2 END,
  ISNULL(NvarcharCol3, '')
FROM
  StagingTable

但显然,这意味着丢失潜在相关数据或数值精度的风险。

您可以在 MSDN 上阅读哪些数据类型可以相互隐式转换(向下滚动到矩阵)。对于所有其他转换,您必须使用CASTCONVERT

于 2012-12-18T15:31:39.930 回答
0
INSERT INTO Destination (Weighting)
SELECT CAST(src.Weighting AS decimal(28, 16))
  FROM [Source] src

应该可以正常工作,前提是您的 varchar 值格式正确。如果错误仍然存​​在,请举例说明正在转换的值。

NULL 将成功转换为 NULL。

于 2012-12-18T15:24:49.527 回答
0

TSQL 具有将数据转换或转换为您想要的类型的功能。如果您在源中的数据类型严格来说是您尝试将它们存储在目标表中并且在目标表的规范中,那么您将不会遇到太多麻烦。

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

An example: I can cast 123 as a varchar(20) then cast the varchar into a decimal with no problem when it is appropriate.

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

However if I try to convert a character it will give an error.

SELECT cast(cast('1a3' as varchar(20)) as decimal(8,2))
于 2012-12-18T15:38:18.867 回答
0

The null only be a problem if the target column does not allow nulls, I think the problem is that the format string that can not always be converted into a decimal, see if the decimal separator is a comma instead of a point.

于 2012-12-18T15:40:04.703 回答