MSSQL存储过程 - 返回多个列

时间:2014-01-05 18:23:40

标签: javascript sql-server azure-mobile-services

(如果您来自Google,我answered my own question已修复)

从WAMS(Windows Azure移动服务)运行存储过程时遇到一些问题。

当我想获得查询的所有相关表时,它只返回相关表中的最后一行。

存储过程看起来类似于以下内容:

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界面定义的变量返回一些行。

该过程按原样执行,但它只返回我定义的最后一行,而不是所有与我从“交集”表中获得的ID相关的行。

我的WAMS API脚本非常基本。根据查询字符串值执行存储过程,将其保存到响应变量中,该变量将返回。

我的交集表结构如下:

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

1                    10009      1
2                    10009      2

我的related_table是这样的:

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

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

“var”列是另一个外键,但这是一个与我的问题无关的表。

4 个答案:

答案 0 :(得分:1)

只是在黑暗中拍摄,也许你应该改变

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

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

答案 1 :(得分:1)

您不需要所有这些IF语句。他们有点混乱查询IMO。您的查询可以重写如下:

;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不为空但@id为空时,根本不希望它选择任何内容,那么您仍然可以使用嵌套的IF结构问题,但如果这不是你的意图,那么这两项检查都是必要的。

无论您做什么,IF @var IS NOT NULL AND @var!= 0语句都可以使用IF ISNULL(@var, 0) <> 0进行汇总,在我的查询中表示为WHERE ISNULL(p.[Var], 0) > 0

您还在最后SELECT中调用了列“行”。我把它们留作“row1,row2,......”。

答案 2 :(得分: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

sp:

中的T-SQL
SELECT
    id, information, information2 
FROM
    View
WHERE
    var = @var

这让我做了我想做的事。

WAMS Api编辑器中的NODE.js就像这样简单:

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文件,如果我想进行更改。 / p>

答案 3 :(得分:0)

测试数据

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 ║
╚════════════════╩═══════╩════╩════╩═════════════╩══════════════╩═════════════════════════╝