2009-06-23 61 views
-1
CREATE PROCEDURE [dbo].[sp_SelectRecipientsList4Test] --'6DBF9A01-C88F-414D-8DD9-696749258CEF','Emirates.Description','0','5' 
--'6DBF9A01-C88F-414D-8DD9-696749258CEF', 
--'121f8b91-a441-4fbf-8a4f-563f53fcc103' 
(
@p_CreatedBy UNIQUEIDENTIFIER, 
@p_SortExpression NVARCHAR(100), 
@p_StartIndex INT, 
@p_MaxRows INT 
) 
AS 
SET NOCOUNT ON; 
IF LEN(@p_SortExpression) = 0 
SET @p_SortExpression = 'Users.Name Asc' 

DECLARE @sql NVARCHAR(4000) 
SET @sql=' 

DECLARE @p_CreatedBy UNIQUEIDENTIFIER 

SELECT 
Name, 
POBox, 
EmirateName, 
TelephoneNo, 
RecipientID, 
CreatedBy, 
CreatedDate, 
ID 

FROM 
(

SELECT  Users.Name, Users.POBox, Emirates.Description As EmirateName, 

UserDetails.TelephoneNo, AddressBook.RecipientID,AddressBook.CreatedBy, AddressBook.CreatedDate, 

AddressBook.ID, 
ROW_NUMBER() OVER(ORDER BY '+ @p_SortExpression +') AS Indexing 

FROM   AddressBook INNER JOIN 
         Users ON AddressBook.RecipientID = Users.ID INNER JOIN 
         UserDetails ON Users.ID = UserDetails.UserID INNER JOIN 
         Emirates ON Users.EmiratesID = Emirates.ID 
----WHERE  (AddressBook.CreatedBy = @p_CreatedBy) 
) AS NewDataTable 

WHERE Indexing > '+ CONVERT(NVARCHAR(10), @p_StartIndex) + 
' AND Indexing<=(' + CONVERT (NVARCHAR(10),@p_StartIndex) + ' + ' 
+ CONVERT(NVARCHAR(10),@p_MaxRows)+') ' 

EXEC sp_executesql @sql 

这查询不给予任何错误,但也没有给出任何结果 请帮助帮我写这个查询

回答

10

你尝试过打破该语句,检查中间结果是否符合预期?这就是你要做的调试复杂语句......

例如,在那里有一个嵌套的SELECT。如果您自己提交该SELECT,它是否会打印预期值?

编辑:有一种教人钓鱼的说法。 “CK”和“n8wrl”给你鱼今天吃了,现在请练习捕鱼养活你明天......

3

您正在查询:

'WHERE Indexing > '+ CONVERT(NVARCHAR(10), @p_StartIndex) + 
' AND Indexing<=(' + CONVERT (NVARCHAR(10),@p_StartIndex) + ' + ' 

,然后加入最大行数作为一个字符串,你内心W¯¯

'WHERE Indexing > '+ CONVERT(NVARCHAR(10), @p_StartIndex) + 
' AND Indexing <='+ CONVERT(NVARCHAR(10),@p_StartIndex + @p_MaxRows) 

编辑

问题是:你可以像这样做更容易这里是你传递的参数,你需要做

'WHERE  (AddressBook.CreatedBy = ''' + CAST(@p_CreatedBy AS CHAR(36)) + ''')' 
+0

此查询工作精绝,与所有内部连接和SELECT语句,当IM加入其中,这是我的查询评论它没有给出预期的结果“WHERE条件(AddressBook.CreatedBy = @p_CreatedBy)“这些行是注释和查询工作正常,但我想把这个条件。 – 2009-06-23 12:30:06

+0

@Yaser Ahmed - 我添加了另一个修复程序来解决您的问题。列和参数名称不准确,因为编辑答案时问题消失。 – cjk 2009-06-23 12:44:37

+0

我甚至试过这个where子句,它仍然没有工作。即时通讯获取此错误数据类型varchar和uniqueidentifier在添加运算符中不兼容。 – 2009-06-24 11:04:36

1

你确定你所有的连接都应该是内连接吗?

5

嗯,这是一个快速浏览:

WHERE Indexing > '+ CONVERT(NVARCHAR(10), @p_StartIndex) + ' AND Indexing<=(' + CONVERT (NVARCHAR(10),@p_StartIndex) +... 

看起来你正在寻找一个不可能的条件,不象这样:

WHERE Indexing > 5 AND Indexing <= 5 

所以这可能是为什么你得到没有行,但是这个过程也适用于SQL注入攻击。基于可能未验证的参数即时构建SQL是非常危险的。

1

变化sp_executesql的用印刷体书写并看看有什么获取生成的(穷人的调试器)

除此之外什么都别人告诉你,

给我一个好的理由,为什么您使用sp_executesql在EXEC?您没有使用参数化的语句,你也不会从SQL注入攻击的保护,因为你只需要执行整个字符串

这将只是臃肿过程缓存每次,这是跑了,有些值的变化,每一次你会得到一个新的计划

请看看Changing exec to sp_executesql doesn't provide any benefit if you are not using parameters correctlyAvoid Conversions In Execution Plans By Using sp_executesql Instead of Exec