我想知道是否可以将声明的变量设置为选择结果的返回值?类似的东西:
@WatchedSeconds
SET @WatchedSeconds = 200
DECLARE @SelectedVideo int
SET @SelectedVideo = (SELECT TOP 1 * FROM Video v WHERE v.VideoID = 12)
IF @SelectedVideo IS NOT NULL
BEGIN
IF @SelectedVideo.VideoLength = @WatchedSeconds
BEGIN
--DO SOMETHING
END
IF @SelectedVideo.SomeOtherColumn = @SomethingElse
BEGIN
END
END
用于SELECT
Stored Procedure
个DECLARE @VideoSeconds int
SET @VideoSeconds = (SELECT v.Length FROM Video v WHERE v.VideoID = @VideoID)
结果中的一些信息。
我知道我可以将变量设置为例如一个整数,并将其设置为所选结果,如果它返回一个整数,例如:
SELECT
这样,如果我需要使用Video
结果中的更多值,我必须创建多个变量和多个Model.connection.transaction do
result = Model.connection.select_value("CALL myStoredProcedure(...);")
end
调用。这就是我想要避免的。
答案 0 :(得分:3)
您只需运行以下命令即可:
SELECT @videoSeconds = v.Length FROM Video v WHERE v.VideoID = @VideoID
以便不添加SET
部分。
此外,您必须确保查询只返回1行,否则会产生错误。
答案 1 :(得分:1)
您可以尝试类似
的内容(首先声明变量......)
SELECT TOP 1 @var1=col1, @var2=col2, @var3=col3, [...] FROM YourTable WHERE YourFilter
编辑:所有这一切似乎都不是最好的方法...使用SQL,您不应该考虑值和单行,而应考虑结果集(基于集合的编程)。你的想法导致许多微小的选择,而循环,游标和所有这些应该避免的东西。
答案 2 :(得分:0)
您可以将结果存储在临时表或表变量中:
SELECT TOP 1 *
INTO #SelectedVideo
FROM Video v
WHERE v.VideoID = 12;
然后您可以在代码中稍后分配表中的值。类似的东西:
IF ( (SELECT VideoLength FROM #SelectedVideo) = @WatchedSeconds)
但是,对于您的特定示例,如果您在video(VideoId)
上有索引,那么使用临时表几乎无法获得性能提升。
答案 3 :(得分:0)
如果您尝试获取的内容类似于以过程语言返回数据集(因此您可以键入类似Result.Field1 =' Test'),那么我就不会这样做认为这是可能的。您只需要声明多个变量并将SELECT调用作为
SELECT TOP 1 @var1=col1, @var2=col2, @var3=col3, [...] FROM YourTable WHERE YourFilter
正如@Shnugo建议的那样
'数据集' SQL中的等效结构是游标,但它们也需要设置变量,因此没有任何好处。