2012-09-17 35 views
0

我有一个存储过程,我使用while循环从表中进行选择,并根据其索引号将结果插入到多行的变量表中。我希望能够传递表名作为参数,但我无法弄清楚如何。我正在把商店程序放在这里,看看你们是否可以帮助我。谢谢!SQL Server:传递表名作为参数插入变量表

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 
+0

使用事先准备好的声明。 – Kermit

回答

0

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

仅供参考,请不要子查询简单COUNT DISTINCT,只是做了如下图所示:

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条线路去你有行

SET @DHC = (SELECT COUNT (*) FROM(SELECT DISTINCT StudentID FROM **@TableName** WHERE IndexEnrollmentObjective = @EO_CODE) X) 
+0

非常感谢cyberkiwi,它工作完美!!!!! – brsqldev