Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用存储过程的结果数据集计数更新列_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 使用存储过程的结果数据集计数更新列

Sql 使用存储过程的结果数据集计数更新列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表#data,其中包含Id和Count列。此外,我还有一个存储过程MyProc,它接受一个参数@id(等于id列)并返回一个数据集(计数等于count列) 我的目标是使用MyProc从Id分配Count列,而不使用光标 我知道,像这样的事情是行不通的: UPDATE d SET Count = (SELECT COUNT(*) FROM (EXEC MyProc d.Id)) FROM #data AS d 是否有我不知道的语法,或者光标是实现这一点的唯一选项 PS:这对我来说是一个代

我有一个表
#data
,其中包含
Id
Count
列。此外,我还有一个存储过程
MyProc
,它接受一个参数
@id
(等于
id
列)并返回一个数据集(计数等于
count
列)

我的目标是使用
MyProc
Id
分配
Count
列,而不使用光标

我知道,像这样的事情是行不通的:

UPDATE d
SET Count = (SELECT COUNT(*) FROM (EXEC MyProc d.Id))
FROM #data AS d
是否有我不知道的语法,或者光标是实现这一点的唯一选项


PS:这对我来说是一个代码质量和性能问题。调用存储过程是不重复50行SQL的最简单方法,但光标会减慢它的速度。

我不完全理解您要做什么,但我认为您的解决方案将涉及@ROWCOUNT;注意:

-- Sample data and proc...
----------------------------------------------------------------------
IF OBJECT_ID('tempdb..#data') IS NOT NULL DROP TABLE #data;
IF OBJECT_ID('dbo.MyProc') IS NOT NULL DROP PROC dbo.MyProc;
GO

CREATE TABLE #data 
(
  id      int,
  [Count] int
);

INSERT #data VALUES (1,5), (1,10), (2,3), (4,6);
GO

CREATE PROC dbo.MyProc(@id int)
AS
BEGIN
  SELECT 'some value'
  FROM #data
  WHERE @id = id;
END;
GO
之前的数据:

id          Count
----------- -----------
1           5
1           10
2           3
4           6
使用@ROWCOUNT的例程

DECLARE @someid int = 1; -- the value you're passing to your proc

EXEC dbo.MyProc 1;
DECLARE @rows int = @@ROWCOUNT; -- this is what you need.

UPDATE #data
SET [Count] = @rows
WHERE id = @someid;
之后的数据

id          Count
----------- -----------
1           2
1           2
2           3
4           6

我不完全理解您想做什么,但我认为您的解决方案将涉及@ROWCOUNT;注意:

-- Sample data and proc...
----------------------------------------------------------------------
IF OBJECT_ID('tempdb..#data') IS NOT NULL DROP TABLE #data;
IF OBJECT_ID('dbo.MyProc') IS NOT NULL DROP PROC dbo.MyProc;
GO

CREATE TABLE #data 
(
  id      int,
  [Count] int
);

INSERT #data VALUES (1,5), (1,10), (2,3), (4,6);
GO

CREATE PROC dbo.MyProc(@id int)
AS
BEGIN
  SELECT 'some value'
  FROM #data
  WHERE @id = id;
END;
GO
之前的数据:

id          Count
----------- -----------
1           5
1           10
2           3
4           6
使用@ROWCOUNT的例程

DECLARE @someid int = 1; -- the value you're passing to your proc

EXEC dbo.MyProc 1;
DECLARE @rows int = @@ROWCOUNT; -- this is what you need.

UPDATE #data
SET [Count] = @rows
WHERE id = @someid;
之后的数据

id          Count
----------- -----------
1           2
1           2
2           3
4           6

我相信您可以使用以下查询:

    IF OBJECT_ID('dbo.data') IS NOT NULL DROP TABLE data;
    IF OBJECT_ID('dbo.MyFunct') IS NOT NULL DROP FUNCTION dbo.MyFunct;
    GO

    CREATE TABLE data 
    (
      ID      int,
      [Count] int
    );

    INSERT data VALUES (1,5), (1,10), (2,3), (4,6);
    GO

    UPDATE d
    SET d.[Count] = f.CNT
    FROM 
        (SELECT ID,COUNT(id) AS CNT FROM data GROUP BY ID) f 
    INNER JOIN data d ON f.ID = d.ID
我找不到使用存储过程的方法。需要时,您可以使用表值函数:

    CREATE FUNCTION dbo.MyFunct(@id INT)
    RETURNS @i TABLE
    (ID INT , CNT INT)
    AS
    BEGIN
        INSERT INTO @i 
        SELECT ID,COUNT(id) AS CNT FROM data GROUP BY ID
    RETURN 
    END;
    GO

    UPDATE d
    SET d.[Count] = f.CNT
    FROM dbo.MyFunct(1) f INNER JOIN data d ON f.ID = d.ID

我相信您可以使用以下查询:

    IF OBJECT_ID('dbo.data') IS NOT NULL DROP TABLE data;
    IF OBJECT_ID('dbo.MyFunct') IS NOT NULL DROP FUNCTION dbo.MyFunct;
    GO

    CREATE TABLE data 
    (
      ID      int,
      [Count] int
    );

    INSERT data VALUES (1,5), (1,10), (2,3), (4,6);
    GO

    UPDATE d
    SET d.[Count] = f.CNT
    FROM 
        (SELECT ID,COUNT(id) AS CNT FROM data GROUP BY ID) f 
    INNER JOIN data d ON f.ID = d.ID
我找不到使用存储过程的方法。需要时,您可以使用表值函数:

    CREATE FUNCTION dbo.MyFunct(@id INT)
    RETURNS @i TABLE
    (ID INT , CNT INT)
    AS
    BEGIN
        INSERT INTO @i 
        SELECT ID,COUNT(id) AS CNT FROM data GROUP BY ID
    RETURN 
    END;
    GO

    UPDATE d
    SET d.[Count] = f.CNT
    FROM dbo.MyFunct(1) f INNER JOIN data d ON f.ID = d.ID

要做到你所说的,你需要的是一个函数,而不是一个过程

CREATE FUNCTION dbo.myFunc (@Id INT)
    RETURNS INT
AS
BEGIN

  UPDATE someTable
     SET someCol = 'someValue'
   WHERE id = @Id;  

  RETURN @@ROWCOUNT;
END
GO
然后在update语句中调用函数

UPDATE d
   SET d.Count = dbo.myFunc(d.Id)
  FROM #data AS d;
但是,基于行的操作是不好的做法。您应该始终努力执行基于集合的操作,但由于我不知道您的过程是做什么的,对于您应该做什么,我只能给出一个粗略的猜测(根本不使用过程):


要做到你所说的,你需要的是一个函数,而不是一个过程

CREATE FUNCTION dbo.myFunc (@Id INT)
    RETURNS INT
AS
BEGIN

  UPDATE someTable
     SET someCol = 'someValue'
   WHERE id = @Id;  

  RETURN @@ROWCOUNT;
END
GO
然后在update语句中调用函数

UPDATE d
   SET d.Count = dbo.myFunc(d.Id)
  FROM #data AS d;
但是,基于行的操作是不好的做法。您应该始终努力执行基于集合的操作,但由于我不知道您的过程是做什么的,对于您应该做什么,我只能给出一个粗略的猜测(根本不使用过程):


在这种情况下,光标是唯一的方法。如果您想提高性能,您需要打开存储过程并尝试以基于集合的方式重写它,然后您就可以用一大堆ID来完成。还可以将SP重写为标量值函数。这样,您就可以不用光标进行操作,但仍然存在性能问题。如果您发布您的SP代码,我们可能能够帮助您在这种情况下,光标是唯一的方式。如果您想提高性能,您需要打开存储过程并尝试以基于集合的方式重写它,然后您就可以用一大堆ID来完成。还可以将SP重写为标量值函数。这样,您就可以不用光标进行操作,但仍然存在性能问题。如果您发布您的SP代码,我们可能会进一步提供帮助。@@ROWCOUNT是一个有趣的想法,但不是我需要的。核心问题是,我必须更新所有行。这意味着我必须经常调用我的SP,光标会减慢它的速度。我想避开光标,但到目前为止似乎不可能
@@ROWCOUNT
是一个有趣的想法,但不是我需要的。核心问题是,我必须更新所有行。这意味着我必须经常调用我的SP,光标会减慢它的速度。我希望避免使用游标,但到目前为止,似乎不可能使用帮助器表值函数来返回表,因为这是解决方案。非常感谢。解决方案是使用一个返回表的helper表值函数。非常感谢。