2014-01-05 4 views
0

(Если вы здесь от Google, я answered my own question с исправлением)MSSQL хранимых процедур - Возвращение более чем один столбец

У меня есть некоторые проблемы при запуске хранимой процедуры из WAMS (Windows Azure Mobile Service) ,

Он возвращает только последнюю строку в соответствующей таблице, когда я хотел бы получить все соответствующие таблицы для запроса.

Хранимая процедура выглядит вроде следующего:

DECLARE @id bigint 

SET @id = 0 

IF @var IS NOT NULL AND @var!= 0 
BEGIN 
    SELECT @id = id FROM intersection WHERE var = @var 
    IF @id IS NOT NULL 
    BEGIN 
     SELECT row1, row2, row3 FROM relevant_table WHERE id = @id 
    END 
END 

Как вы можете видеть, я пытаюсь вернуть некоторые строки на основе переменной я определил с помощью WA SQL Manager Interface.

Процедура выполняется так, как она есть сейчас, однако она возвращает только последнюю строку, которую я когда-либо определял, а не все строки, относящиеся к идентификатору, который я получаю из таблицы «пересечение».

Скрипт My WAMS API довольно простой. Выполняет хранимую процедуру на основе значения строки запроса, сохраняет ее в переменной ответа, которую она вернет.

Моя таблица пересечения структурирована как следующие:

intesection_id(int) var(int) id(int)-foreign key = fkey_0 

1     10009  1 
2     10009  2 

И мой relevant_table, как это:

id(int)-foreign key = fkey_0 information information2 created 

1        "some info" "other info" default = getdate() 
2        "other info" "even more" --||--    

Столбец «вар» еще один внешний ключ, но это к столу что не имеет отношения к моей проблеме.

+0

И какой столбец является «иностранным ключом», отношения между двумя таблицами? –

+0

@ M.Ali обновленный OP снова – NicT

ответ

1

Вам не нужны все те IF заявления. Они вроде загромождают запрос ИМО. Ваш запрос может быть переписан следующим образом:

;WITH parms AS (SELECT 
    [Var] = @var 
) 

SELECT rt.row1 
    , rt.row2 
    , rt.row3 
FROM parms p 
JOIN intersection isec 
    ON isec.[var] = p.[Var] 
JOIN relevant_table rt 
    ON rt.id = isec.id 
WHERE ISNULL(p.[Var], 0) <> 0 

Этот запрос возвращает пустой набор, если @var является NULL или 0. Если вы просто не хотите, чтобы он вообще ничего не выбрал, если @var имеет значение NULL или @var не имеет значения null, но @id имеет значение null, вы все равно можете использовать вложенную структуру IF в своем вопросе, но если это не ваше намерение, абсолютно необходимы.

Независимо от того, что вы делаете, оператор IF @var IS NOT NULL AND @var!= 0 можно охарактеризовать с помощью IF ISNULL(@var, 0) <> 0, который представлен как WHERE ISNULL(p.[Var], 0) > 0 в моем запросе.

Вы также называете свои столбцы «рядами» в последних SELECT. Я оставил их как «row1, row2, ...».

+0

Обновлен мой op, как выглядят таблицы. Я думаю, что я здесь просто логический nullpointer. – NicT

+1

Вот скрипт SQL (http://sqlfiddle.com/#!3/02bc0/1) с представлением структуры, которую вы добавили к вашему OP, и реализацией моего запроса с parms.Var установлен на 10009. Вы в вашем дополнении, в вашем дополнении «таблица пересечений», я сохранил «пересечение» в примере. –

+0

Вы изменили бы «10009» на «@var» в «parms» CTE в своей собственной реализации, как и в моем ответе. –

1

Просто выстрел в темноте, возможно, вы должны изменить

IF @var IS NOT NULL AND @var!= 0 

В

IF @var IS NOT NULL AND @var <> 0 
+0

Спасибо, я буду помнить об этом :) – NicT

+0

В любое время мы живем в эпоху, когда мы кодируем больше языков, чем мы можем говорить, синтаксические смешения - это изо дня в день вещь :) – YuvalHerziger

0

Test Data

DECLARE @intersection TABLE (intesection_id INT, [Var] INT, ID INT) 
INSERT INTO @intersection 
VALUES (1,10009,1),(2,10009,2),(3,10010,2),(4,10010,2) 

DECLARE @relevant_table TABLE (id int,information VARCHAR(20),information2 VARCHAR(20) 
           ,created DATETIME) 
INSERT INTO @relevant_table 
VALUES (1,'some info','other info',getdate()), 
(2,'other info','even more',getdate()) 

Запрос

DECLARE @id int; 
DECLARE @var int; 

SET @var = 10009 --<-- @var value from your proc 

IF (@var IS NOT NULL AND @var <> 0) 
BEGIN 
    SELECT TOP 1 @id = ID FROM @intersection WHERE [Var] = @var 
END 

IF (@id IS NOT NULL AND @id <> 0) 
BEGIN 
    SELECT * 
    FROM @intersection I INNER JOIN @relevant_table R 
    ON I.ID = R.id 
    WHERE R.id = @id 
END 

Результат Набор

╔════════════════╦═══════╦════╦════╦═════════════╦══════════════╦═════════════════════════╗ 
║ intesection_id ║ Var ║ ID ║ id ║ information ║ information2 ║   created   ║ 
╠════════════════╬═══════╬════╬════╬═════════════╬══════════════╬═════════════════════════╣ 
║    1 ║ 10009 ║ 1 ║ 1 ║ some info ║ other info ║ 2014-01-05 19:42:52.450 ║ 
╚════════════════╩═══════╩════╩════╩═════════════╩══════════════╩═════════════════════════╝ 
+0

Как я могу быть глупым! Но, учитывая, как я использую идентификатор для поиска во второй таблице, будет ли цикл лучше? – NicT

+0

Зачем вам использовать цикл ??? если вы проверяете несколько значений, используйте оператор 'IN'. –

1

Я исправил проблему, выбрав безопасный путь и добавив вид сверху. Я могу позволить себе это.

T-SQL в Вид:

SELECT 
    intersection.intersection_id, 
    intersection.var, 
    relevant_table.id, 
    relevant_table.information, 
    relevant_table.information2 
FROM 
    dbo.intersection 
INNER JOIN 
    dbo.relevant_table 
ON 
    relevant_table.id = intersection.id 

T-SQL в зр:

SELECT 
    id, information, information2 
FROM 
    View 
WHERE 
    var = @var 

Это позволило мне сделать довольно много, что я хотел.

Node.js в WAMS Api Редактор так же легко, как это:

var mssql = request.service.mssql; 
var sql_query = "EXEC sp_getvar ?"; 

mssql.query(sql_query, [var], { 
    success: function(res) { 
     response.send(statusCodes.OK, res) 
    }, 

Не имея дело с бизнес-логики в моем API была моя главная цель, это в основном только облегчает добавление API вызовов на вместо того, чтобы изменять каждый отдельный файл api, если я хочу внести изменения.

Смежные вопросы