我有一个表#data
,其中包含Id
和Count
列。另外,我有一个存储过程MyProc
接受参数@id
(等于Id
列)并返回一个数据集(计数等于Count
列)。
我的目标是从Count
分配Id
列,MyProc
,无光标。
我知道,这样的事情不起作用:
UPDATE d
SET Count = (SELECT COUNT(*) FROM (EXEC MyProc d.Id))
FROM #data AS d
是否有我不知道的语法或光标是实现此目的的唯一选择?
PS:这对我来说是代码质量和性能问题。调用存储过程将是最简单的方法,无需重复50行SQL,但游标会将其减慢。
答案 0 :(得分:1)
我相信您可以使用以下查询:
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
答案 1 :(得分:1)
要做你说的话,你需要一个功能,而不是一个程序。
TransactionsEntities entities = new TransactionsEntities();
然后在更新语句中调用该函数;
CREATE FUNCTION dbo.myFunc (@Id INT)
RETURNS INT
AS
BEGIN
UPDATE someTable
SET someCol = 'someValue'
WHERE id = @Id;
RETURN @@ROWCOUNT;
END
GO
但是,基于行的操作是不好的做法。你应该总是努力执行基于集合的操作,但由于我不知道你的程序是做什么的,所以我不能提供你应该做的事情(不使用程序):
UPDATE d
SET d.Count = dbo.myFunc(d.Id)
FROM #data AS d;
答案 2 :(得分:0)
我不完全明白你要做什么,但我认为你的解决方案将涉及@@ 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