Hal*_*yon 9 sql sql-server stored-procedures
我在SQL Server 2005中有一个SQL查询,当我包含条件顺序时,它会破坏.当我删除订单时,查询有效.当我按条件明确地写顺序时(例如按p.Description排序),它就可以了.当我包含条件顺序时,我得到错误,
'Conversion failed when converting character string to smalldatetime data type'
Run Code Online (Sandbox Code Playgroud)
SQL Server没有向我显示哪行代码导致此错误.我想知道如何解决这个问题,以便我可以使用条件顺序或解决哪一列在转换中失败.
declare @SearchTerm nvarchar(255)
declare @SortBy nvarchar(255)
declare @Months int
declare @VendorID int
declare @ProductID int
set @SearchTerm = 'focus'
set @SortBy = 'product'
set @Months = 3
set @VendorID = null
set @ProductID = null
-- This makes it so the @Month will filter by n number of months ago.
declare @PreviousMonths datetime
if @Months is null
begin
set @PreviousMonths = 24
end
else
begin
set @PreviousMonths = DateAdd(month, -@Months, GetDate())
end
select
a.dsAlertID as AlertID,
a.ProductID,
v.VendorID,
p.Description as ProductName,
v.LongName as VendorName,
a.Introduction,
a.Writeup,
a.DateAdded
from
ev_ds_Alerts a
left outer join
tblProducts p on a.ProductID = p.ProductID
left outer join
tblVendors v on v.VendorID = p.VendorID
where
( @SearchTerm is null or ( a.Writeup like '% ' + @SearchTerm + '%' or a.Introduction like '% ' + @SearchTerm + '%') )
and (( @Months is null ) or ( @Months is not null and a.DateAdded >= @PreviousMonths))
and (( @VendorID is null ) or ( @VendorID is not null and v.VendorID = @VendorID ))
and (( @ProductID is null ) or ( @ProductID is not null and p.ProductID = @ProductID ))
order by
case @SortBy
when 'product' then p.Description
when 'vendor' then v.LongName
else a.DateAdded
end
-- order by p.Description or v.LongName works when explicitly writing them out!
Run Code Online (Sandbox Code Playgroud)
gib*_*ath 16
根据上一个答案,尝试:
order by
case @SortBy
when 'product' then p.Description
when 'vendor' then v.LongName
else convert(VARCHAR(25),a.DateAdded,20)
Run Code Online (Sandbox Code Playgroud)
这应该给你你想要的排序,因为它将格式化日期字符串yyyy-mm-dd hh:mm:ss.
Guf*_*ffa 12
您可以为每种数据类型使用一种情况:
order by
case @SortBy
when 'product' then p.Description
when 'vendor' then v.LongName
else ''
end,
case @SortBy
when 'added' then a.DateAdded
else '1980-01-01'
end
Run Code Online (Sandbox Code Playgroud)
在 - 中使用CASE
表达式时,ORDER BY
返回的数据类型必须始终相同.
你不能选择你想要的东西 - INT,DATETIME,VARCHAR等 - 而不使用动态SQL或某种形式的决策逻辑(IE IF
:)来突破不同的查询.
在此示例中,您可以使用CAST/CONVERT将DATETIME数据类型更改为适当的VARCHAR.但除非您知道问题发生的原因,否则您将来可能会再次这样做.
归档时间: |
|
查看次数: |
14866 次 |
最近记录: |