我正在尝试运行一个将数据插入“表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.
答案结尾处有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行,则不会出现任何错误。
现在,您可能已经注意到变量名称和类型已从更改DATE
为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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句