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
此查询不会给出任何错误,但也不会给出任何结果 请帮忙
答案 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 correctly和Avoid Conversions In Execution Plans By Using sp_executesql Instead of Exec