如果有人可以帮助我,我会非常兴奋...我已经花了大约4个小时而且无法找出为什么T-SQL给我错误的结果并且sql中的相同查询很好(我的意思是@ZipCodeIDS不为null,这就是为什么我在普通sql中为其余的vars设置null。)
T-SQL查询:
-- validate the reference number pattern
DECLARE @PCodePattern nvarchar(130)
IF @PCode = '' SET @PCode = NULL
IF @PCode IS NOT NULL
BEGIN
IF LTRIM(RTRIM(@PCode)) <> ''
BEGIN
-- filter by pattern
SELECT @PCodePattern = @PCode
END
END -- @PCode
if (@strAddress is not null)
set @strAddress = '%' + @strAddress + '%'
Declare @listofIDS table(zipcodeids int)
delete from @listofIDS
IF @ZipCodeIDS = '' SET @ZipCodeIDS = NULL
IF @ZipCodeIDS IS NOT NULL
BEGIN
IF CHARINDEX(',', @ZipCodeIDS) = 0
BEGIN
insert @listofIDS values(@ZipCodeIDS)
END
ELSE
BEGIN
set @ZipCodeIDS = @ZipCodeIDS + ','
WHILE CHARINDEX(',', @ZipCodeIDS) <> 0
BEGIN
insert @listofIDS values(Left(@ZipCodeIDS, CHARINDEX(',',@ZipCodeIDS) - 1))
SET @ZipCodeIDS = SUBSTRING(@ZipCodeIDS, CHARINDEX(',',@ZipCodeIDS) + 1, LEN(@ZipCodeIDS) - CHARINDEX(',',@ZipCodeIDS))
END
END
END
-- select the property data
INSERT INTO @PropertyDetails (PropertyID, PCode, PropertyStatusID, PropertyStatusName,
PropertyTypeID, PropertyTypeName, ResearchStatusID,
ResearchStatusName, FullAddress, PartialAddress, Address1,
Address2, ZipCodeID, ZipCode, ZipCodeDescription, CityID,
CityName, StateID, StateName, StateCode, NumBedrooms, NumBathrooms,
LivingSquareFeet, LotSquareFeet, YearBuilt, ZillowLink,
AssessorParcelNumber, DateWentREO, DateAppearedOnMLS, IsOnTheMLS,
ZPropertyID, LowestPrice, HighestPrice, AskingPrice, DateTimeRecorded,
RecordedByPersonID, RecordedByPersonName, AssignedToPersonID,
AssignedToPersonName, WatchTag, Latitude, Longitude)
SELECT p.PropertyID, p.PCode, p.PropertyStatusID, ps.Name, p.PropertyTypeID, pt.Name,
p.ResearchStatusID, rs.Name, dbo.GetAddress(p.PropertyID),
dbo.GetPartialAddress(p.PropertyID), p.Address1, p.Address2, p.ZipCodeID, z.Code,
z.Description, p.CityID, c.Name, p.StateID, s.Name, s.Code, p.NumBedrooms,
p.NumBathrooms, p.LivingSquareFeet, p.LotSquareFeet, p.YearBuilt, p.ZillowLink,
p.AssessorParcelNumber, p.DateWentREO, p.DateAppearedOnMLS, p.IsOnTheMLS,
p.ZPropertyID, p.LowestPrice, p.HighestPrice, p.AskingPrice, p.DateTimeRecorded,
p.RecordedByPersonID, dbo.GetDisplayName(p.RecordedByPersonID), p.AssignedToPersonID,
dbo.GetDisplayName(p.AssignedToPersonID), w.WatchTag, p.latitude, p.longitude
FROM Properties p
JOIN cfgPropertyStatuses ps
ON ps.PropertyStatusID = p.PropertyStatusID
JOIN cfgPropertyTypes pt
ON pt.PropertyTypeID = p.PropertyTypeID
JOIN cfgResearchStatuses rs
ON rs.ResearchStatusID = p.ResearchStatusID
JOIN ZipCodes z
ON z.ZipCodeID = p.ZipCodeID
JOIN cfgStates s
ON s.StateID = p.StateID
LEFT JOIN cfgCities c
ON c.CityID = p.CityID
LEFT JOIN Watches w
ON w.PropertyID = p.PropertyID AND w.PersonID = @LoggedInPersonID
WHERE /*
******* missing filter *******
this line should filter the risks by @LoggedInPersonID via role
******************************
AND */(@PropertyID IS NULL OR p.PropertyID = @PropertyID)
AND (@PCodePattern IS NULL OR p.PCode LIKE @PCodePattern)
AND (@ZipCodeIDS IS NULL
OR p.ZipCodeID IN (select zipcodeids from @listofIDS))
AND (@NumBedroomsFrom IS NULL OR (p.NumBedrooms >= @NumBedroomsFrom
AND @NumBedroomsTo IS NOT NULL
AND p.NumBedrooms <= @NumBedroomsTo)
OR (p.NumBedrooms = @NumBedroomsFrom
AND @NumBedroomsTo IS NULL))
AND (@NumBedroomsTo IS NULL OR (p.NumBedrooms <= @NumBedroomsTo
AND (@NumBedroomsTo IS NULL OR p.NumBedrooms <= @NumBedroomsTo)))
AND (@LivingSizeFrom IS NULL OR (p.LivingSquareFeet >= @LivingSizeFrom))
AND (@LivingSizeTo IS NULL OR (p.LivingSquareFeet <= @LivingSizeTo))
AND (@LotSizeFrom IS NULL OR (p.LotSquareFeet >= @LotSizeFrom))
AND (@LotSizeTo IS NULL OR (p.LotSquareFeet <= @LotSizeTo))
AND
/* if status is null, return all. Or, return only statuses that are passed in */
(@PropertyStatuses IS NULL or
((p.PropertyStatusID=@PropertyStatuses and (p.PropertyStatusID & (32 | 128)) = 0) or
@PropertyID is not null or @PCode is not null) or
(p.PropertyStatusID = (p.PropertyStatusID & @PropertyStatuses)))
/*
-- return the property if the specific ID was given otherwise ommit Sold and Archived
AND ((p.PropertyStatusID & (32 /*sold*/ | 128 /*archived*/)) = 0
OR @PropertyID IS NOT NULL
OR @PCode IS NOT NULL))
OR (p.PropertyStatusID = (p.PropertyStatusID & @PropertyStatuses)))
*/
AND (@PropertyTypes IS NULL
OR (p.PropertyTypeID = (p.PropertyTypeID & @PropertyTypes)))
AND (@ResearchStatuses IS NULL
OR (p.ResearchStatusID = (p.ResearchStatusID & @ResearchStatuses)))
AND (@IsOnTheMLS IS NULL OR p.IsOnTheMLS = @IsOnTheMLS)
and (@strAddress is null or (p.Address1 LIKE @strAddress or p.Address2 LIKE @strAddress))
RETURN
和相同,由我在SQL中翻译(效果很好):
/****** Script for SelectTopNRows command from SSMS ******/
SELECT TOP 1000 [PropertyID]
,[PCode]
,[Address1]
,[Address2]
,[NumBedrooms]
,[NumBathrooms]
,[LivingSquareFeet]
,[LotSquareFeet]
,[YearBuilt]
,[ZillowLink]
,[AssessorParcelNumber]
,[DateWentREO]
,[DateAppearedOnMLS]
,[IsOnTheMLS]
,[ZPropertyID]
,[LowestPrice]
,[HighestPrice]
,[AskingPrice]
,[DateTimeRecorded]
,[RecordedByPersonID]
,[AssignedToPersonID]
,[latitude]
,[longitude]
,[Zestimate]
FROM [dev_hotsheetDB].[dbo].[Properties] p
JOIN [dev_hotsheetDB].[dbo].cfgPropertyStatuses ps
ON ps.PropertyStatusID = p.PropertyStatusID
JOIN [dev_hotsheetDB].[dbo].cfgPropertyTypes pt
ON pt.PropertyTypeID = p.PropertyTypeID
JOIN [dev_hotsheetDB].[dbo].cfgResearchStatuses rs
ON rs.ResearchStatusID = p.ResearchStatusID
JOIN [dev_hotsheetDB].[dbo].ZipCodes z
ON z.ZipCodeID = p.ZipCodeID
JOIN [dev_hotsheetDB].[dbo].cfgStates s
ON s.StateID = p.StateID
LEFT JOIN [dev_hotsheetDB].[dbo].cfgCities c
ON c.CityID = p.CityID
where
(NULL IS NULL OR p.PropertyID = NULL)
AND (NULL IS NULL OR p.PCode LIKE NULL)
AND ('1' IS NULL
OR p.ZipCodeID IN (select zipcodeids from [dev_hotsheetDB].[dbo].[listofIDS]))
AND (NULL IS NULL OR (p.NumBedrooms >= NULL
AND NULL IS NOT NULL
AND p.NumBedrooms <= NULL)
OR (p.NumBedrooms = NULL
AND NULL IS NULL))
AND (NULL IS NULL OR (p.NumBedrooms <= NULL
AND (NULL IS NULL OR p.NumBedrooms <= NULL)))
AND (NULL IS NULL OR (p.LivingSquareFeet >= NULL))
AND (NULL IS NULL OR (p.LivingSquareFeet <= NULL))
AND (NULL IS NULL OR (p.LotSquareFeet >= NULL))
AND (NULL IS NULL OR (p.LotSquareFeet <= NULL))
AND
/* if status is null, return all. Or, return only statuses that are passed in */
(NULL IS NULL or
((p.PropertyStatusID=NULL and (p.PropertyStatusID & (32 | 128)) = 0) or
NULL is not null or NULL is not null) or
(p.PropertyStatusID = (p.PropertyStatusID & NULL)))
/*
-- return the property if the specific ID was given otherwise ommit Sold and Archived
AND ((p.PropertyStatusID & (32 /*sold*/ | 128 /*archived*/)) = 0
OR @PropertyID IS NOT NULL
OR @PCode IS NOT NULL))
OR (p.PropertyStatusID = (p.PropertyStatusID & @PropertyStatuses)))
*/
AND (NULL IS NULL
OR (p.PropertyTypeID = (p.PropertyTypeID & NULL)))
AND (NULL IS NULL
OR (p.ResearchStatusID = (p.ResearchStatusID & NULL)))
AND (NULL IS NULL OR p.IsOnTheMLS = NULL)
and (NULL is null or (p.Address1 LIKE NULL or p.Address2 LIKE NULL))
请注意,该问题仅与IN
语句有关...当@ZipCodeIDS ='1,2,3'时,它应返回414结果(普通sql ok),但T-SQL函数返回80。
我注意到的一件奇怪的事情是,T-SQL只考虑来自@ZipCodeIDS的第一个id (如你所见,我将这些ID拆分并放入临时表中)。所以这是问题 - 关于第一个id ...(无法确认这是唯一的问题,因为有时候第一个zipCodeId它不应该返回任何东西,但它仍然返回结果)
请你伸出援助之手吗? Ps:对于我的普通sql查询,我使用了一个带有这些id的真实表,只是为了尽可能地模仿行为......
UPDATE :将@ZipCodeIDS拆分并插入临时表非常有效:http://data.stackexchange.com/stackoverflow/q/109406/
答案 0 :(得分:2)
通过Timbo帮助解决了这个问题!!!!!
我已声明@ZipCodeIDS varchar
,并且默认情况下它是由VARCHAR(1)制作的。
我将其更改为@ZipCodeIDS varchar(50)并且它完全无效!!!!
很抱歉,因为这个声明对你来说是隐藏的!