插入前Microsoft SQL Server转换中的存储过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入前Microsoft SQL Server转换中的存储过程相关的知识,希望对你有一定的参考价值。
我正在尝试创建一个存储过程,在插入到我的表之前对传入的参数进行操作。我的表中的一个列叫做DATE_CHANGED
,基本上我在这里要做的就是将传递的日期参数更改为2017年12月1日到20171201.这是一个int
值。
我写了一个这样的存储过程:
CREATE PROCEDURE date_generate
@startDate DATE
AS
BEGIN
DECLARE @DATE_KEY INT
@DATE_KEY = CONVERT(INT, FORMAT(@startDate, 'YYYYMMDD')
INSERT INTO table date_key = @DATE_KEY
END
但是我收到了一个错误
'@DATE_KEY附近的语法不正确
声明的局部变量仅用于SQL查询语句
select *
from table
where date_key = @DATE_Key?
答案
有多个错误。
- 使用SET为变量赋值。
- 看看INSERT语句也是如此。
CREATE PROCEDURE date_generate @startDate date AS BEGIN DECLARE @DATE_KEY int; SET @DATE_KEY = CONVERT(int, format(@startDate, 'YYYYMMDD')); INSERT INTO DATE_CHANGED (date_key) VALUES (@DATE_KEY); END
另一答案
这看起来很奇怪。你甚至不需要局部变量。根据您的代码,您可以写:
create procedure date_generate (
@startDate date
) as
begin
insert into table (date_key)
values ( convert(int, format(@startDate, 'YYYYMMDD')) );
end; -- date_generate
或者,我可能会写:
create procedure date_generate (
@startDate date
) as
begin
insert into table (date_key)
values ( year(@startDate) * 10000 + month(@startDate) * 100 + day(@startDate) );
end;
为什么你会在每一行上都有一个单独日期的表对我来说没有意义。为什么你将“日期”存储为整数也没有意义。
另一答案
据我所知,您的存储过程接受DATE作为参数,但您需要使用INT进行INSERT。
您可以通过以下方式轻松地将DATE转换为VARCHAR,然后转换为INT:
DECLARE @DateASInt INT = CAST(CONVERT(VARCHAR(8), @startDate, 112) AS INT);
所以,你的存储过程将是这样的:
CREATE PROCEDURE date_generate
@startDate date
AS
BEGIN
INSERT INTO date_key
VALUES (CAST(CONVERT(VARCHAR(8), @startDate, 112) AS INT));
END
以上是关于插入前Microsoft SQL Server转换中的存储过程的主要内容,如果未能解决你的问题,请参考以下文章
[Microsoft][ODBC SQL Server Driver][SQL Server]无法将 NULL 值插入列 'msrepl_tran_version,该列不允许
Microsoft SQL Server 2005 从返回多个表的子过程插入表
使用查询从 Microsoft SQL Server 导出数据到目标数据