繁体   English   中英

MSSQL存储过程-返回多个列

[英]MSSQL Stored Procedure - Return more than one column

(如果您是Google来的,我会用一个解决方法回答我自己的问题

我从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”列是另一个外键,但这是与我的问题无关的表。

只是在黑暗中一枪,也许你应该改变

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

进入

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

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

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

您还在最后一个SELECT中将列称为“行”。 我将它们保留为“ row1,row2,...”。

我通过安全的方式修复了问题,并在顶部添加了一个视图。 我买得起

视图中的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在sp中:

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文件的情况下进行更改。

测试数据

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM