首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server :将表名作为参数传递以插入到变量表中

SQL Server :将表名作为参数传递以插入到变量表中
EN

Stack Overflow用户
提问于 2012-09-18 06:21:23
回答 1查看 6.4K关注 0票数 0

我有一个存储过程,我使用while循环从表中进行选择,并根据索引号将结果插入到多行的变量表中。我希望能够将表名作为参数传递,但我不知道如何传递。我把存储过程放在这里,看看你们能不能帮我。谢谢!

代码语言:javascript
复制
USE [Enrollment] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO

ALTER PROCEDURE [dbo].[Enrollment_By_Objective] --exec Enrollment_By_Objective @TableName = 'Students'

@TableName VARCHAR (50)

AS

BEGIN

SET NOCOUNT ON

DECLARE @EO_CODE INT 
       ,@EO_NAME VARCHAR(100) 
       ,@DHC INT
       ,@PCA INT
       ,@PC INT
       ,@SE INT
       ,@COA INT
       ,@CO INT
       ,@NCL INT

DECLARE @EnrollmentData TABLE 
(
     EnrollmentObjective NVARCHAR(100)
    ,DistinctHeadCount INT
    ,ProgramCompletersAll INT
    ,ProgramCompleters INT
    ,StillEnrolled INT
    ,CompletedObjectiveAll INT
    ,CompletedObjective INT
    ,NonCompletedLeavers INT
)

SET @EO_CODE = 1
WHILE (@EO_CODE <= 10)
    BEGIN
        SET @EO_NAME = @EO_CODE
        SET @DHC = (SELECT COUNT (*) FROM(SELECT DISTINCT StudentID FROM **@TableName** WHERE IndexEnrollmentObjective = @EO_CODE) X)
        SET @PCA = (SELECT COUNT (*) FROM(SELECT DISTINCT StudentID FROM Students WHERE ExitCode = 'P' AND IndexEnrollmentObjective = @EO_CODE) X)
        SET @PC = (SELECT COUNT (*) FROM(SELECT DISTINCT StudentID FROM Students WHERE ExitCode = 'P' AND Outcome IN ('R', 'E', 'I') AND IndexEnrollmentObjective = @EO_CODE) X)
        SET @SE = (SELECT COUNT (*) FROM(SELECT DISTINCT StudentID FROM Students WHERE ExitCode IS NULL  AND IndexEnrollmentObjective = @EO_CODE) X)
        SET @COA = (SELECT COUNT (*) FROM(SELECT DISTINCT StudentID FROM Students WHERE ExitCode IN ('C', 'N', 'S') AND IndexEnrollmentObjective = @EO_CODE) X)
        SET @CO = (SELECT COUNT (*) FROM(SELECT DISTINCT StudentID FROM Students WHERE ExitCode IN ('C', 'N', 'S') AND Outcome IN ('R', 'E', 'I')  AND IndexEnrollmentObjective = @EO_CODE) X)
        SET @NCL = (SELECT COUNT (*) FROM(SELECT DISTINCT StudentID FROM Students WHERE ExitCode NOT IN ('C', 'N', 'P','S')  AND IndexEnrollmentObjective = @EO_CODE) X)

        INSERT INTO @EnrollmentData
            SELECT @EO_NAME, @DHC, @PCA, @PC, @SE, @COA, @CO, @NCL
            WHERE @DHC > 0

        SET @EO_CODE = @EO_CODE + 1
    END

UPDATE @EnrollmentData
SET EnrollmentObjective = 
(
    SELECT
        CASE WHEN EnrollmentObjective = '1' THEN 'Certificate Seekers'
             WHEN EnrollmentObjective = '2' THEN 'Occupational Upgrade'
             WHEN EnrollmentObjective = '3' THEN 'Senior Citizen'
             WHEN EnrollmentObjective = '4' THEN 'Bad Data'
             WHEN EnrollmentObjective = '5' THEN 'Apprenticeship'
             WHEN EnrollmentObjective = '6' THEN 'Basic Skills'
             WHEN EnrollmentObjective = '7' THEN 'Life Long Learning'
             WHEN EnrollmentObjective = '8' THEN 'Assessment'
             WHEN EnrollmentObjective = '9' THEN 'Secondary'
             WHEN EnrollmentObjective = '10' THEN 'Job Re-entry'
             ELSE EnrollmentObjective 
        END
)

SELECT * FROM @EnrollmentData
END
EN

回答 1

Stack Overflow用户

发布于 2012-09-18 09:50:56

使用dynamic SQL生成语句,然后使用带有输出参数的sp_executeSQL检索结果。

仅供参考,请不要子查询简单的COUNT DISTINCT,只需如下所示:

代码语言:javascript
复制
declare @sql nvarchar(max)
set @sql = N'select @DHC = count(distinct studentid) from ' + @TableName + ' where IndexEnrollmentObjective = @EO_CODE'
exec sp_executesql @sql, N'@DHC int output,@EO_CODE INT', @DHC output, @EO_CODE

这3行放在你有行的地方

代码语言:javascript
复制
SET @DHC = (SELECT COUNT (*) FROM(SELECT DISTINCT StudentID FROM **@TableName** WHERE IndexEnrollmentObjective = @EO_CODE) X)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12467897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档