在执行过程中转换数据类型时出错
Error Converting Data Type in Execute Procedure
我正在尝试 运行 一个将数据插入 "Table A" 的执行过程。对于一个特定参数,我将参数类型设置为 "Date" 以匹配 "Table 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
预期结果:数据将无误地插入table
当前结果:
Msg 8114, Level 16, State 1, Procedure p_example, Line 0 [Batch Start Line 0]
Error converting data type nvarchar to date.
此行会导致您收到以下错误:
EXECUTE [dbo].[p_example]
@DateExample = DateExample
DateExample
参数需要 date
数据类型,而您正试图将其设置为 "DateExample"。
TL;DR 在答案的最后。
以下是我的更改和建议方法的完整答案和理由。
1.漫漫长路:
我会对您的代码进行一些调整和评论:
按照下面的定义,你的存储过程应该得到一个 类型 'date' 的单个 值作为参数(到目前为止还不错)
ALTER Procedure [dbo].[p_example]
@DateExample date
AS
begin
您的插入查询采用 @DateExample 参数并将其添加到 [Table 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
查询没有 "define" 存储在 "DateExample" 中的值,您稍后可以将其传递给存储过程。为了将该值存储在您可以 re-use 它的地方,您需要将它存储到一个变量中(至少)。
所以,我会将上面的查询修改为:
DECLARE @DateExample date;
Select DISTINCT
@DateExample = D.DateExample
From DatabaseEx.dbo.ViewExample D
Where 1 = 1
然而,这还不是全部。上面的查询仍然会失败 if SELECT DISTINCT
will return more than 1 value.
SELECT DISTINCT
并不意味着 return 单个唯一值 ,但是它将 return 所有唯一值存储在 DateExample 列来自 DatabaseEx.dbo.ViewExample 视图。
如果您只想将查询中的 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
将 return 超过 1 行,您将不会收到任何错误。
现在,您可能注意到变量名称和类型已从 DATE
更改为 TABLE
。这需要我们也更改存储过程的代码,使其接受这种新类型的参数。
为了将更多行数据传递给我们的存储过程,我们首先必须创建一个新的 table 类型,我们将使用它来存储多行数据作为参数,以便我们可以稍后将其传递给我们的存储过程。
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
我正在尝试 运行 一个将数据插入 "Table A" 的执行过程。对于一个特定参数,我将参数类型设置为 "Date" 以匹配 "Table 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
预期结果:数据将无误地插入table
当前结果:
Msg 8114, Level 16, State 1, Procedure p_example, Line 0 [Batch Start Line 0]
Error converting data type nvarchar to date.
此行会导致您收到以下错误:
EXECUTE [dbo].[p_example]
@DateExample = DateExample
DateExample
参数需要 date
数据类型,而您正试图将其设置为 "DateExample"。
TL;DR 在答案的最后。
以下是我的更改和建议方法的完整答案和理由。
1.漫漫长路:
我会对您的代码进行一些调整和评论:
按照下面的定义,你的存储过程应该得到一个 类型 'date' 的单个 值作为参数(到目前为止还不错)
ALTER Procedure [dbo].[p_example]
@DateExample date
AS
begin
您的插入查询采用 @DateExample 参数并将其添加到 [Table 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
查询没有 "define" 存储在 "DateExample" 中的值,您稍后可以将其传递给存储过程。为了将该值存储在您可以 re-use 它的地方,您需要将它存储到一个变量中(至少)。
所以,我会将上面的查询修改为:
DECLARE @DateExample date;
Select DISTINCT
@DateExample = D.DateExample
From DatabaseEx.dbo.ViewExample D
Where 1 = 1
然而,这还不是全部。上面的查询仍然会失败 if SELECT DISTINCT
will return more than 1 value.
SELECT DISTINCT
并不意味着 return 单个唯一值 ,但是它将 return 所有唯一值存储在 DateExample 列来自 DatabaseEx.dbo.ViewExample 视图。
如果您只想将查询中的 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
将 return 超过 1 行,您将不会收到任何错误。
现在,您可能注意到变量名称和类型已从 DATE
更改为 TABLE
。这需要我们也更改存储过程的代码,使其接受这种新类型的参数。
为了将更多行数据传递给我们的存储过程,我们首先必须创建一个新的 table 类型,我们将使用它来存储多行数据作为参数,以便我们可以稍后将其传递给我们的存储过程。
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