解决方案 »
- UPDATE char类型,一直报错
- identity列如何在某个时候手动设置初始值?
- 帮帮忙,急啊。数据显示问题。
- 关于还原数据库的SQL语句,感谢!!!!!!!!!!!!!!!!!!!!!!!!!
- 请各位高手帮小妹解答,小妹感激不尽!!
- sql server支持面向对象模型吗?用过的进来说说。
- 求命!!!极难的SQL
- 一个表格,但很难,根据数据之间的关系排序,求查询语句。
- 在DELPHI中调用在SQL SERVER2000中编写的存储过程,出了点错,请各位过来指点一二(100分酬谢)
- 在2000下,SQL 7.0中运行sqlmangr.exe时出现提示“对指定设备,路径或文件的访问被拒绝”,无法运行该命令。而且不能反安装,因为任务管理器中找不到"in use"的sqlagent.exe.怎么办??
- 在线等待,过滤数据,相同数据只取出两条,求SQL语句
- 游标的定义问题
dt1 datetime,
dt2 datetime,
price int
)
GO
CREATE PROCEDURE SetPrice(@dt1 datetime,@dt2 datetime,@price int)
AS
BEGIN
IF EXISTS(SELECT * FROM table1 WHERE dt1 = @dt1 AND dt2 = @dt2)
BEGIN
-- 有完全相同的分段,直接更新价格
UPDATE table1 SET price = @price WHERE dt1 = @dt1 AND dt2 = @dt2
END
ELSE
BEGIN
-- 因为有一段截掉中间变二段的可能,用INSERT插入截取后的段
INSERT INTO table1
SELECT dt1, DateAdd(day,-1,@dt1), price
FROM table1
WHERE dt1 < @dt1 AND @dt1 <= dt2 INSERT INTO table1
SELECT DateAdd(day,1,@dt2), dt2, price
FROM table1
WHERE dt1 <= @dt2 AND @dt2 < dt2 -- 删除所有和新段有交集(MAX(@dt1,dt1) <= MIN(@dt2,dt2))的段
DELETE FROM table1
WHERE (CASE WHEN @dt1 > dt1 THEN @dt1 ELSE dt1 END) <=
(CASE WHEN @dt2 < dt2 THEN @dt2 ELSE dt2 END) -- 插入新分段
INSERT INTO table1 VALUES (@dt1,@dt2,@price)
END RETURN
END
GO
DELETE FROM table1
EXEC SetPrice '2015-01-01','2016-12-31',500
SELECT * FROM table1 ORDER BY dt1
EXEC SetPrice '2015-02-01','2015-10-03',600
SELECT * FROM table1 ORDER BY dt1
EXEC SetPrice '2015-05-03','2016-05-03',800
SELECT * FROM table1 ORDER BY dt1
dt1 dt2 price
----------------------- ----------------------- -----------
2015-01-01 00:00:00.000 2016-12-31 00:00:00.000 500dt1 dt2 price
----------------------- ----------------------- -----------
2015-01-01 00:00:00.000 2015-01-31 00:00:00.000 500
2015-02-01 00:00:00.000 2015-10-03 00:00:00.000 600
2015-10-04 00:00:00.000 2016-12-31 00:00:00.000 500dt1 dt2 price
----------------------- ----------------------- -----------
2015-01-01 00:00:00.000 2015-01-31 00:00:00.000 500
2015-02-01 00:00:00.000 2015-05-02 00:00:00.000 600
2015-05-03 00:00:00.000 2016-05-03 00:00:00.000 800
2016-05-04 00:00:00.000 2016-12-31 00:00:00.000 500