(如果您来自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”列是另一个外键,但这是一个与我的问题无关的表。
答案 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-SQLSELECT
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 ║
╚════════════════╩═══════╩════╩════╩═════════════╩══════════════╩═════════════════════════╝