执行过程中转换数据类型时出错

史蒂文

我正在尝试运行一个将数据插入“表A”的执行过程。对于一个特定参数,我将参数类型设置为“ Date”以匹配“表A”中“ DateExample”列的数据类型。出于某种原因,即使数据类型是日期,系统仍将视图数据源“ ViewExample”中的字段数据类型识别为nvarchar。

我尝试将参数设置为nvarchar,但收到以下错误:

Msg 241, Level 16, State 1, Procedure p_example, Line 34 [Batch Start Line 0]
Conversion failed when converting date and/or time from character string

码:

ALTER Procedure [dbo].[p_example]
,   @DateExample date

AS 

begin

INSERT INTO [DatabaseEx].[dbo].[Table A]
           ([DateExample]

)

values (

    @DateExample


)

end

Select DISTINCT 
    D.DateExample
From DatabaseEx.dbo.ViewExample D

Where 1 = 1

GO



EXECUTE [dbo].[p_example]

    @DateExample = DateExample



GO

预期结果:数据将正确插入表中

当前结果:

Msg 8114, Level 16, State 1, Procedure p_example, Line 0 [Batch Start Line 0]
Error converting data type nvarchar to date.
拉杜·格奥尔基(Radu Gheorghiu)

答案结尾处有TL; DR。

以下是我所做更改和建议方法的完整答案和理由。

1.很长的路要走:

关于您的代码,我将进行一些调整和注释:

按下面的定义,存储过程应该接受一个单一型“日期”的值作为参数(到目前为止好)

ALTER Procedure [dbo].[p_example]
    @DateExample date
AS 
begin

您的插入查询使用@DateExample参数并将其添加到[表A]中,到目前为止效果很好

INSERT INTO [DatabaseEx].[dbo].[Table A]
           ([DateExample])
values (@DateExample)

end

这似乎是您决定将哪个值传递给存储过程的部分。我在这里找到第一个可能的问题。

Select DISTINCT 
    D.DateExample
From DatabaseEx.dbo.ViewExample D
Where 1 = 1

您的SELECT DISTINCT查询没有“定义”存储在“ DateExample ”中的值,您以后可以将其传递给存储过程。为了将该值存储在可以重复使用的位置,您需要将其存储到一个变量中(至少)。

因此,我将上面的查询修改为:

DECLARE @DateExample date;

Select DISTINCT 
    @DateExample = D.DateExample
From DatabaseEx.dbo.ViewExample D
Where 1 = 1

但是,这还不是全部。如果 SELECT DISTINCT返回的值大于1,上述查询仍将失败

SELECT DISTINCT并不意味着返回单个唯一值,但是它将返回DatabaseEx.dbo.ViewExample视图DateExample列中存储的所有唯一值

如果您确实只希望将查询中的1个值传递给存储过程,或者想要将1个以上的值传递给存储过程,则以下版本会更好。

DECLARE @DateExampleTable TABLE (dateExample date);

INSERT INTO @DateExampleTable (dateExample)
Select DISTINCT 
    D.DateExample
From DatabaseEx.dbo.ViewExample D
Where 1 = 1

这将覆盖所有内容,并且如果SELECT DISTINCT返回的行多于1行,则不会出现任何错误

现在,您可能已经注意到变量名称和类型已从更改DATETABLE这要求我们还更改存储过程的代码,以便它接受这种新类型的参数。

为了将更多的数据行传递给存储过程,我们首先必须创建一个新的表类型,该表类型将用于存储多行数据作为参数,以便以后可以将其传递给我们的存储过程。

CREATE TYPE DateTableType AS TABLE (DateExample date);

ALTER Procedure [dbo].[p_example]
    @DateExampleParam DateTableType READONLY
AS 
begin

INSERT INTO [DatabaseEx].[dbo].[Table A]
           ([DateExample])
SELECT DateExample
FROM @DateExampleParam 

end

现在我们有了新版本的存储过程,

EXECUTE [dbo].[p_example]
    @DateExampleParam = @DateTableExample

2. TL; DR摘要如下:

现在,如果我们将我刚刚写的所有内容汇总到一个重构脚本中,它将看起来像这样:

CREATE TYPE DateTableType AS TABLE (DateExample date);
GO    

ALTER Procedure [dbo].[p_example]
    @DateExampleParam DateTableType READONLY
AS 
begin

INSERT INTO [DatabaseEx].[dbo].[Table A]
           ([DateExample])
SELECT DateExample
FROM @DateExampleParam 

end
GO

DECLARE @DateExampleTable TABLE (dateExample date);

INSERT INTO @DateExampleTable (dateExample)
Select DISTINCT 
    D.DateExample
From DatabaseEx.dbo.ViewExample D
Where 1 = 1

EXECUTE [dbo].[p_example]
    @DateExampleParam = @DateExampleTable 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在存储过程中将数据类型varchar转换为bigint时出错

SQL查询将nvarchar转换为数据类型int在存储过程中出错

如何获取错误“将数据类型nvarchar转换为int时出错”。通过尝试在SQL Server存储过程中的catch语句?

存储过程-将数据类型varchar转换为float时出错

存储过程错误:“将数据类型nvarchar转换为uniqueidentifier时出错”

存储过程-将数据类型varchar转换为数值时出错

在执行查询时将数值转换为数据类型数值的算术溢出错误

将数据类型从varchar转换为数值时出错

将数据类型 varchar 转换为 float 时出错。?

将数据类型NVarchar转换为int时出错

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

SQL Server 2008中的存储过程中的数据类型转换错误

在通用函数中转换数据类型时无效。toint 被调用,但 v 的类型仍然是 double

存储过程数据类型转换错误

存储过程算术溢出错误将表达式转换为数据类型int

Firebird存储过程数据类型转换出现溢出错误

将数据类型 nvarchar 转换为 bigint 时出错 - 加入两种不同的数据类型时

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

将数据类型varchar转换为varbinary时出错。转换为整数时的MSSQL

在过程中执行varchar2时出错

插入数据时将数据类型varchar转换为数字时出错

PHP PDO unixODBC FreeTDS SQL Server在存储过程中“将数据类型varchar(max)转换为datetime”

将数据类型 varchar 转换为 float 时出错,即使变量/列已经是 float 数据类型

获取“将数据类型 varchar 转换为数字时出错”。即使转换后

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

将数据类型nvarchar转换为数字时出错。尝试转换并替换

如何在Windows Powershell中转换数据类型?

我想从嵌套列表中转换数据类型

使用多个别名列时,将数据类型 varchar 转换为数字时出错