datepart和isdate问题(100分)

  • 主题发起人 主题发起人 唐朝笨蛋
  • 开始时间 开始时间

唐朝笨蛋

Unregistered / Unconfirmed
GUEST, unregistred user!
1,一个表tmptable
id tmpdate
1 2008-1-1
2 2009-12-25
3 大富翁

2,通过tmptable建了视图
CREATE VIEW dbo.VIEW1
AS
SELECT *
FROM tmptable
WHERE (isdate(tmpdate) = 1)

表内容显示
id tmpdate
1 2008-1-1
2 2009-12-25
3,对表操作
SELECT *
FROM VIEW1
WHERE (DATEPART(mm, tmpdate) = 1)

出错,提示字符串转为datetime类型时发生语法错误

结论:也就是说第2步的isdate过滤对第3步的操作并没有效果,datepart时,仍旧把id为3的数据进行操作,于是报错

问题:为什么会这样,如何避免
 
估計是SQL的查詢優化導致的
建議先抽取出臨時表,再處理
 
也考虑过用临时表

但数据量大时,用临时表好像就不怎么适合?
 
SELECT *
FROM tmptable
WHERE ISDATE(tmpdate) AND (DATEPART(mm, tmpdate) = 1)
 
那能否把無用的數據先刪除了,再計算?
SQL的查詢會自動優化,不像Delphi那樣,如果帶And的條件,會先執行前面那個語句,SQL查詢的條件好像是沒有順序的,是SQL自己按自己的方法去執行的。
要不你在物理表上增加一個字段isdate bit,UPDATE一下,再最后增加isdate=1看看效果
 
主要是不能删除
能删除就用触发器直接管着了。。。


在另一帖里已经有朋友回答了

结帖送分 呵呵
 
后退
顶部