用于循环辅助的SQL Server

用于循环辅助的SQL Server,sql,sql-server,Sql,Sql Server,好的,这是到目前为止我的存储过程 ALTER Procedure GetJobInfo() AS BEGIN Select EmployeeId, FirstName, LastName From dbo.Employees for EmployeeId SELECT ComputerCodeId From dbo.EmployeeJobs Whe

好的,这是到目前为止我的存储过程

    ALTER Procedure GetJobInfo()
    AS
    BEGIN
        Select EmployeeId, FirstName, LastName
        From dbo.Employees
        for EmployeeId 
            SELECT ComputerCodeId 
            From dbo.EmployeeJobs 
            Where ComputerCodeId = "F"
    END

我需要从dbo.EmployeeJobs表中获取与计算机代码数组匹配的EmployeeJobs,这是我已经完成的工作。我该怎么做那样的事呢?我的最终目标是能够创建一个报告,根据与员工工作相关联的计算机代码将员工工作分为两个类别,然后获得两个类别的总和,并让它们填充两个不同的列。

您可以尝试加入,而不是循环

ALTER Procedure GetJobInfo()
AS
BEGIN
    SELECT EmployeeId, FirstName, LastName
    FROM dbo.Employees E
    INNER JOIN dbo.EmployeeJobs EJ
    ON E.EmployeeId = EJ.EmployeeId
    Where EJ.ComputerCodeId = "F"
END
您需要了解sql的特性

它将提供您所需要的,并且是在查询中使用循环的方法

基本语法是:

您可以找到有关WHILE循环的更多信息

调查并阅读相关信息,然后试一试


编辑:有关其他方法,请参阅post

我不完全确定你想要什么,但你有两个选择

如果表EmployeeJobs包含列EmployeeId,请尝试使用此选项

从dbo.EmployeeJobs中选择EJ.ComputerCodeId、E.EmployeeId、E.FirstName、E.LastName作为EJ内部连接dbo.EmployeeId=E.EmployeeId上的E作为E的员工,其中EJ.ComputerCodeId='F'

否则,如果您无法匹配EmployeeId,您可以使用以下内容,这将按ComputerCodeId进行过滤,并按每个员工进行交叉

选择EJ.ComputerCodeId、E.EmployeeId、E.FirstName、E.LastName 来自dbo.EmployeeJobs作为EJ,dbo.Employees作为E
其中EJ.ComputerCodeId='F'

提供一些示例数据和预期输出。普通TSQL不适合或设计用于生成报告。编写报告通常涉及某种专门用于此目的的应用程序,即使该应用程序类似于Excel。您应该从使用您选择的工具而不是通用tsql编写报告的角度来完成此任务,最终目标是能够以列表的形式返回所有内容,然后从所述列表填充reportviewer。建议不要使用内部联接,因为某些记录将丢失包含null的记录,如果索引不好,性能可能会受到影响。只有在EmployeeId为null时,记录才会丢失。我不认为有任何记录会有空的EmployeeId。是的,我总是有一个EmployeeId。我该怎么做才能使computerCodeId等于一组计算机代码?你不能说,你只能假设,他没有提供任何关于EmployeeId的信息。此外,如果EmployeeId索引不好,将影响性能。我们无法猜测,我们需要利用现有资源:该计划针对一家拥有约20名员工的公司,它们都有一个INT类型的Id。好的,我在那里有了它,在我尝试获取计算机代码Id之前,它似乎工作得很好。其中dbo.EmployeeJobs.ComputerCodeId=1应该是什么,但出于某种原因,它说的是无效的列名1。ComputerCodeId将是一个int。关于如何修复该错误的任何线索?可能是因为您使用的是双引号而不是单引号,但如果列是int,则只需将1放在不带引号的位置。我该如何将Where EJ.ComputerCodeId设置为一个int数组?如果要遍历所有值,只需删除Where子句,如果没有,您可以使用1,5,6中的WHERE EJ.ComputerCodeId
DECLARE @cnt INT = 0;

    WHILE @cnt < cnt_total
    BEGIN
       {...statements...}
       SET @cnt = @cnt + 1;
    END
DECLARE @cnt INT = 0;

WHILE @cnt < 10
BEGIN
   PRINT 'Inside simulated FOR LOOP on TechOnTheNet.com';
   SET @cnt = @cnt + 1;
END;

PRINT 'Done simulated FOR LOOP on TechOnTheNet.com';
GO