Помогите мне написать этот запрос - PullRequest
0 голосов
/ 23 июня 2009
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 ]

10 голосов
/ 23 июня 2009

Вы пытались разбить утверждение, чтобы проверить, соответствуют ли промежуточные результаты ожидаемым? Это то, что вы делаете для отладки сложного оператора ...

Например, там есть вложенный SELECT. Если вы фиксируете этот SELECT самостоятельно, выводит ли он ожидаемые значения?

Редактировать: Есть поговорка об обучении человека ловить рыбу. 'ck' и 'n8wrl' дали вам рыбу, чтобы поесть сегодня, теперь, пожалуйста, попрактикуйтесь в рыбалке, чтобы накормить вас завтра ...

5 голосов
/ 23 июня 2009

Ну, быстрый взгляд на это:

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

похоже, что вы ищете невозможное условие, не похожее на это:

WHERE Indexing > 5 AND Indexing <= 5

Возможно, поэтому у вас нет строк, но этот процесс созрел и для атак с использованием SQL-инъекций. Сборка SQL на лету, основанная на возможных непроверенных параметрах, очень опасна.

3 голосов
/ 23 июня 2009

Вы запрашиваете:

'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)

EDIT

Проблема с вашим внутренним WHERE в том, что вы передаете параметр, вам нужно сделать

'WHERE       (AddressBook.CreatedBy = ''' + CAST(@p_CreatedBy AS CHAR(36)) + ''')'
1 голос
/ 23 июня 2009

Измените sp_executesql на PRINT и посмотрите, что сгенерировано (отладчик бедняка)

Кроме того, что все другие люди говорили тебе,

дайте мне одну вескую причину, почему вы используете sp_executesql вместо exec? Вы не используете параметризованные операторы, вы также не защищены от SQL-инъекций, потому что вы просто выполняете всю строку

Это приведет к тому, что кэш процедур будет раздуваться каждый раз, когда он будет запущен, а некоторые значения меняются, каждый раз вы будете получать новый план

Пожалуйста, взгляните на Изменение exec на sp_executesql не даст никакой выгоды, если вы не используете параметры правильно и Избегайте преобразований в планах выполнения с помощью sp_executesql вместо Exec

1 голос
/ 23 июня 2009

Вы уверены, что все ваши объединения должны быть внутренними?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...