帮我写这个查询

时间:2009-06-23 11:26:21

标签: sql-server

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

此查询不会给出任何错误,但也不会给出任何结果 请帮忙

5 个答案:

答案 0 :(得分:10)

您是否尝试分解声明,检查中间结果是否符合预期?这就是你调试复杂语句的方法......

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

编辑:有一种关于教男人钓鱼的说法。 'ck'和'n8wrl'今天给你吃鱼,现在请练习钓鱼明天喂你...

答案 1 :(得分:5)

嗯,快速浏览一下:

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

看起来你正在寻找一个不可能的条件,与此不同:

WHERE Indexing > 5 AND Indexing <= 5

因此,这可能就是为什么你没有获得任何行,但这个proc也适用于SQL注入攻击。基于可能未经验证的参数动态构建SQL是非常危险的。

答案 2 :(得分:3)

您正在查询:

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

然后将最多行添加为字符串,您可以更轻松地执行此操作:

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

修改

你的内部WHERE的问题是你传递参数,你需要做

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

答案 3 :(得分:1)

您确定所有联接都应该是内部联接吗?

答案 4 :(得分:1)

将sp_executesql更改为PRINT并查看生成的内容(穷人的调试器)

除了所有其他人告诉你的,

给我一​​个很好的理由为什么你在exec上使用sp_executesql?您没有使用参数化语句,因为您只是执行整个字符串

,所以也不会受到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