[英]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.