我正在编写网站上使用的查询。当需要查询时,它会直接解析到服务器,结果全部由查询控制。该网站只返回表格。我在网站上拥有的是客户端可以选择的复选框,以及@var = 1
或@var = 0
解析为查询的复选框。因此,我现在有这个代码来检查和添加或不依赖它是否被检查。我的问题是,有没有更好的方法来解决这个问题,而不是使用这样的IF
语句,因为我有几个代码部分包含这个:
SET @sql = 'select distinct '
If @mgchk = 1
SET @sql = @sql + 'p.MainGroup'
If @sgchk = 1 and @sql = 'select distinct '
SET @sql = @sql + 'p.SubGroup'
If @sgchk = 1 and @sql not like '%SubGroup'
SET @sql = @sql + ',p.SubGroup'
If @ssgchk = 1 and @sql = 'select distinct '
SET @sql = @sql + 'p.SubSubGroup'
If @ssgchk = 1 and @sql not like '%SubSubGroup'
SET @sql = @sql + ',p.SubSubGroup'
If @Seasonchk = 1 and @sql = 'select distinct '
SET @sql = @sql + 'p.Season'
If @Seasonchk = 1 and @sql not like '%Season'
SET @sql = @sql + ',p.Season'
If @vendorchk = 1 and @sql = 'select distinct '
SET @sql = @sql + 'p.VendorID'
If @vendorchk = 1 and @sql not like '%VendorID'
SET @sql = @sql + ',p.VendorID'
SET @sql =
@sql +
' into
##aa
from
RPProducts p,
RPIv i,
RPTrsd d,
RPTrs s
WHERE
s.StoreID = d.StoreID and
s.ReceiptNO = d.ReceiptNO and
i.UPC = d.UPC and
i.StoreID = d.StoreID and
i.IVProduct = p.Productid and
s.TRSdate >= '''+ convert(varchar(10), @trsfrom, 101) +''' and
s.TRSdate <= '''+ convert(varchar(10), @trsto, 101) +''''
execute sp_executesql @sql
@mgchk / @sgchk / @ssgchk / @seasonchk / @vendorchk是复选框变量
回答@Aaron,
全局临时因为动态查询。在拉取数据时,整个查询会被处理并立即丢弃。那里不会发生冲突。
我的日期变量是datetime
,它在动态SQL中给我一个错误。
是的,如果有比IF
检查更好用的东西,请回顾同样的事情来检查,这就是整个问题的原因。
我发现使用别名连接更容易......
答案 0 :(得分:4)
-- rather than convert to a dangerously formatted string,
-- here is a much better way to strip time from a datetime
-- (if you need to!)
SET @trsfrom = DATEADD(DAY, DATEDIFF(DAY, 0, @trsfrom), 0);
SET @trsto = DATEADD(DAY, DATEDIFF(DAY, 0, @trsto), 0);
DECLARE @sql NVARCHAR(MAX) = N'SELECT DISTINCT ';
-- here's an easier way to strip the first comma:
SET @sql += SUBSTRING(
CASE WHEN @mgchk = 1 THEN ',p.MainGroup' ELSE '' END
+ CASE WHEN @sgchk = 1 THEN ',p.SubGroup' ELSE '' END
+ CASE WHEN @ssgchk = 1 THEN ',p.SubSubGroup' ELSE '' END
+ CASE WHEN @Seasonchk = 1 THEN ',p.Season' ELSE '' END
+ CASE WHEN @vendorchk = 1 THEN ',p.VendorID' ELSE '' END, 2, 2000);
SET @sql += ' INTO ##aa
FROM
dbo.RPProducts AS p -- use schema prefix!
INNER JOIN dbo.RPIv AS i -- use PROPER JOINS!
ON i.IVProduct = p.Productid
INNER JOIN dbo.RPTrsd AS d
ON i.UPC = d.UPC
AND i.StoreID = d.StoreID
INNER JOIN dbo.RPTrs AS s
ON s.StoreID = d.StoreID
AND s.ReceiptNO = d.ReceiptNO
WHERE s.TRSdate >= @trsfrom -- use strongly typed parameters!
AND s.TRSdate <= @trsto;';
EXEC sp_executesql @sql,
N'@trsfrom DATETIME, @trsto DATETIME',
@trsfrom, @trsto;
----^^^^^^^^^^^^^^^^ here is how the query gets the @trsfrom & @trsto values
我仍然认为你使用##全局临时表非常危险。如果两个人同时运行此代码,则会出现严重问题。