УПОРЯДОЧИТЬ, не функционируя в инструкции SELECT

#sql #sql-server #sql-order-by

#sql #sql-сервер #sql-порядок по

Вопрос:

У меня возникли трудности с некоторым синтаксисом SQL в хранимой процедуре. Я извлекаю самую последнюю строку из таблицы SQL (в SQL Server Management Studio) и использую ее позже в своей хранимой процедуре. Вот почему я устанавливаю переменные (т. Е.: @firstname, @lastname и т.д.). Меня интересует только самая последняя строка, основанная на dbo.[ws_test_request].CREATED значении столбца. Мне нужны переменные, установленные на основе запрошенных данных, поэтому мне нужно, чтобы запрос «Это не работает» работал.

PS: «2011051001» будет переменной… Я просто пытаюсь заставить это работать.

Это работает:

 SELECT 
    TOP 1
    @firstname = [sample_donor_firstname],
    @lastname = [sample_donor_lasttname],
    @middlename = [sample_donor_middlename]
FROM dbo.[ws_test_request]
WHERE 
    [sample_specimen_id] = '2011051001'
ORDER BY dbo.[ws_test_request].created DESC
  

Это не работает:

 SELECT 
    TOP 1
    [sample_donor_firstname],
    [sample_donor_lasttname],
    [sample_donor_middlename]
FROM dbo.[ws_test_request]
WHERE 
    [sample_specimen_id] = '2011051001'
ORDER BY dbo.[ws_test_request].created DESC
  

Спасибо!!

Комментарии:

1. Я объявляю свои переменные над запросом. ОБЪЯВИТЬ @donorid INT, @firstname NVARCHAR(255), @lastname NVARCHAR(255), @identifyingnumber NVARCHAR(255), — SSN / MRN @middlename NVARCHAR(255), @comment NVARCHAR(1023);

2. Каким образом это не работает? Что вы ожидаете от этого? Вы ожидаете, что он установит переменные, даже если вы не устанавливаете переменные в запросе?

3. Единственная разница, по-видимому, заключается в том, что вы не назначаете переменные во втором запросе; так что, если это то, что вы хотите, чтобы произошло, тогда вам нужно будет использовать первый запрос… чего мне не хватает?

4. Привет, ребята, мне, должно быть, нужны очки. ПОРЯДОК ПО подчеркивался красным, потому что в моем предыдущем коде была точка с запятой, а затем я добавил предложение ORDER BY. Таким образом, команда была завершена до ORDER BY . Вы абсолютно правы. В моем коде не было ничего неправильного. Когда я вводил код «Это не работает», я никогда не тестировал это. Я просто установил свою переменную (которая заменила значение 2011051001″ перед моим запросом, поэтому в моей переменной все еще была точка с запятой. Когда я писал это в Stack Overflow, я заменил переменную в запросе значением, чтобы избежать путаницы. Пример:

Ответ №1:

Я не вижу ничего плохого в вашем втором запросе. Если вы хотите использовать результаты на более позднем этапе, вы можете использовать свой первый запрос или использовать declare a cursor:

 DECLARE MyCursor CURSOR FOR
SELECT 
    TOP 1
    [sample_donor_firstname],
    [sample_donor_lasttname],
    [sample_donor_middlename]
FROM dbo.[ws_test_request]
WHERE 
    [sample_specimen_id] = '2011051001'
ORDER BY dbo.[ws_test_request].created DESC
  

а затем откройте и извлеките результаты:

 OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @firstname, @lastname, @middlename
  

Комментарии:

1. Для этого вам не нужен курсор — достаточно просто установить переменную (например, как указано в OP), поскольку он выбирает только ВЕРХНЮЮ 1

2. @M.R.: Я знаю, но я сказал ему, что есть 2 возможности.

Ответ №2:

Ваш первый запрос кажется правильным — второй запрос фактически не устанавливает переменные, поэтому вам просто нужно поместить переменные туда…

 
DECLARE @donorid INT, 
@firstname NVARCHAR(255), 
@lastname NVARCHAR(255), 
@identifyingnumber NVARCHAR(255), -- SSN/MRN 
@middlename NVARCHAR(255), 
@comment NVARCHAR(1023


SELECT       
TOP 1      
@firstname = [sample_donor_firstname],      
@lastname = [sample_donor_lasttname],      
@middlename = [sample_donor_middlename]  
FROM dbo.[ws_test_request]  
WHERE       
[sample_specimen_id] = '2011051001'  
ORDER BY dbo.[ws_test_request].created DESC 

-- and then select the results (or use them wherever else you want to use them)
Select @firstname as FirstName, @lastname as LastName, @middlename as MiddleName
  

Ответ №3:

Привет, ребята, мне, должно быть, нужны очки.

ВЫБЕРИТЕ

1-е место

@firstname = [sample_donor_firstname],

@lastname = [sample_donor_lasttname],

@middlename = [sample_donor_middlename]

ИЗ dbo.[ws_test_request]

ГДЕ

[client_id] = @clientid

И [sample_specimen_id] = @sample_identifyingnumber; — <============= ПЛОХО!!

ПОРЯДОК С ПОМОЩЬЮ dbo.[ws_test_request].создан DESC

Когда я тестировал его со значением «2011051001», я установил для @sample_identifyingnumber значение «2011051001», хотя у меня все еще была точка с запятой. Это то, что привело к сбою моего предложения ORDER BY и получению красного подчеркивания. В моем вопросе не было ничего плохого в моем коде. Но спасибо за идеи использования курсоров! Я изучал SQL в колледже, но не часто использовал его в течение 5 лет. Итак, спасибо за идеи.