运行 SQL 从存储过程中的列查询
Running SQL query from a column in stored procedure
我有一个 table,其中有一列包含用于获取计数的查询。我正在编写一个存储过程来从此 table 中获取记录。我需要做的是执行计数列中的查询和 return 同一列中的值。下面是带有计数列的示例 table。
所以,当我 运行 存储过程时,我应该得到这样的结果:
所以,如果有任何方法可以在 sql 服务器 2008 中实现这一点,你能给我建议吗?
我同意Sorrel Vesper。我不明白为什么要将查询存储在 table.
中
而不是这个 use/create 正确的 SP:
CREATE PROCEDURE GetUserCount
@userId INT
AS
BEGIN
SET NOCOUNT ON;
SELECT COUNT(*) AS UserCount
FROM TableName
WHERE UserId = @userId
END
更多信息,请参阅:CREATE PROCEDURE
如果您想为每个用户获取数据,请使用如下查询:
SELECT UserId, COUNT(*)
FROM TableName
GROUP BY UserId
就这些了!
更多信息,请参阅:Aggregate functions
尽管这个设计很糟糕,但您可以通过以下方式完成所需的工作:
CREATE TABLE Users(ID int)
GO
CREATE TABLE Test(ID INT, Name NVARCHAR(20), Count NVARCHAR(200))
GO
INSERT INTO Users
VALUES ( 1 ),
( 1 ),
( 2 ),
( 3 )
INSERT INTO Test
VALUES ( 1, 'A', 'Select Count(*) From Users where ID = 1' ),
( 2, 'B', NULL ),
( 3, 'C', 'Select Count(*) From Users where ID = 3' ),
( 4, 'D', 'Select Count(*) From Users where ID = 1' )
DECLARE @Results TABLE
(
ID INT ,
Name NVARCHAR(20) ,
Count INT
)
DECLARE @R TABLE ( ID INT )
DECLARE @ID INT ,
@Name NVARCHAR(20) ,
@Statement NVARCHAR(200) ,
@Count INT
DECLARE cur CURSOR FAST_FORWARD READ_ONLY
FOR
SELECT ID , Name , Count FROM Test
OPEN cur
FETCH NEXT FROM cur INTO @ID, @Name, @Statement
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM @R
INSERT INTO @R
EXEC ( @Statement )
INSERT INTO @Results
VALUES ( @ID, @Name, ( SELECT * FROM @R ) )
FETCH NEXT FROM cur INTO @ID, @Name, @Statement
END
CLOSE cur
DEALLOCATE cur
SELECT * FROM @Results
输出:
ID Name Count
1 A 2
2 B NULL
3 C 1
4 D 2
我有一个 table,其中有一列包含用于获取计数的查询。我正在编写一个存储过程来从此 table 中获取记录。我需要做的是执行计数列中的查询和 return 同一列中的值。下面是带有计数列的示例 table。
所以,当我 运行 存储过程时,我应该得到这样的结果:
所以,如果有任何方法可以在 sql 服务器 2008 中实现这一点,你能给我建议吗?
我同意Sorrel Vesper。我不明白为什么要将查询存储在 table.
中而不是这个 use/create 正确的 SP:
CREATE PROCEDURE GetUserCount
@userId INT
AS
BEGIN
SET NOCOUNT ON;
SELECT COUNT(*) AS UserCount
FROM TableName
WHERE UserId = @userId
END
更多信息,请参阅:CREATE PROCEDURE
如果您想为每个用户获取数据,请使用如下查询:
SELECT UserId, COUNT(*)
FROM TableName
GROUP BY UserId
就这些了!
更多信息,请参阅:Aggregate functions
尽管这个设计很糟糕,但您可以通过以下方式完成所需的工作:
CREATE TABLE Users(ID int)
GO
CREATE TABLE Test(ID INT, Name NVARCHAR(20), Count NVARCHAR(200))
GO
INSERT INTO Users
VALUES ( 1 ),
( 1 ),
( 2 ),
( 3 )
INSERT INTO Test
VALUES ( 1, 'A', 'Select Count(*) From Users where ID = 1' ),
( 2, 'B', NULL ),
( 3, 'C', 'Select Count(*) From Users where ID = 3' ),
( 4, 'D', 'Select Count(*) From Users where ID = 1' )
DECLARE @Results TABLE
(
ID INT ,
Name NVARCHAR(20) ,
Count INT
)
DECLARE @R TABLE ( ID INT )
DECLARE @ID INT ,
@Name NVARCHAR(20) ,
@Statement NVARCHAR(200) ,
@Count INT
DECLARE cur CURSOR FAST_FORWARD READ_ONLY
FOR
SELECT ID , Name , Count FROM Test
OPEN cur
FETCH NEXT FROM cur INTO @ID, @Name, @Statement
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM @R
INSERT INTO @R
EXEC ( @Statement )
INSERT INTO @Results
VALUES ( @ID, @Name, ( SELECT * FROM @R ) )
FETCH NEXT FROM cur INTO @ID, @Name, @Statement
END
CLOSE cur
DEALLOCATE cur
SELECT * FROM @Results
输出:
ID Name Count
1 A 2
2 B NULL
3 C 1
4 D 2