SQL Set变量用于选择结果

时间:2015-08-21 10:26:34

标签: sql sql-server stored-procedures

我想知道是否可以将声明的变量设置为选择结果的返回值?类似的东西:

@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 ProcedureDECLARE @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 调用。这就是我想要避免的。

4 个答案:

答案 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中的等效结构是游标,但它们也需要设置变量,因此没有任何好处。