GVKun编程网logo

如何在SQL Server 2008中进行两次while循环(sqlserver的while循环)

1

在这篇文章中,我们将为您详细介绍如何在SQLServer2008中进行两次while循环的内容,并且讨论关于sqlserver的while循环的相关问题。此外,我们还会涉及一些关于SQLServer2

在这篇文章中,我们将为您详细介绍如何在SQL Server 2008中进行两次while循环的内容,并且讨论关于sqlserver的while循环的相关问题。此外,我们还会涉及一些关于SQL Server 2008中的while循环迭代日期范围,然后插入、SQL Server 2008中进行性能数据收集、sql-server – 如何在SQL Server 2008中使用GUID数据类型?、sql-server – 如何在SQL Server 2008中分配整个Active Directory组安全访问?的知识,以帮助您更全面地了解这个主题。

本文目录一览:

如何在SQL Server 2008中进行两次while循环(sqlserver的while循环)

如何在SQL Server 2008中进行两次while循环(sqlserver的while循环)

我正在开发约会日历应用程序。这里还是新手。

我在这方面需要帮助。

我需要在各列(“ calendarID,Slot,AppointmentDate”)中进行两次循环。


slot”列的值将重复1、2、3、4、5、6、7、8重复,最高可达28,而calendarID将不断循环到868值。约会日期的值是从2013年8月1日到2013年8月31日(实际上我打算整整一年)

预期结果

calendarID | Slot       |  AppointmentDate      ----------------------------------------------      1          | 1         | 1 Aug 2013      2          | 2         | 1 Aug 2013        3          | 3         | 1 Aug 2013       4          | 4         | 1 Aug 2013       5          | 5         | 1 Aug 2013       6          | 6         | 1 Aug 2013        7          | 7         | 1 Aug 2013       8          |..until 28 | 1 Aug 2013     9          | 1         | 2 Aug 2013        10         | 2         | 2 Aug 2013    11         | 3         | 2 Aug 2013      ...until       868        | n         | n Month 2013

这是我尝试的代码,似乎与期望的输出距离很远。我编辑了Astrand提供的代码

DECLARE @tblCalendar TABLE(CalendarEntryID INT,    Slot INT,  ADate Varchar(50))DECLARE @x int, @y int , @d INTSET @X = 1 SET @y = 1 SET @d = 1WHILE @X <= 868BEGIN    WHILE  @Y <=28 AND @d <=31 AND @X <= 868 --LOOP FOR SLOT COLUMN        BEGIN        INSERT INTO @tblCalendar (CalendarEntryID,Slot, ADate)        Values (@x, @y,@d +''/Aug/2013'')                SET @y = @y + 1                SET @x = @x + 1        SET @d = @d + 1            END    SET @y = 1  ENDSELECT  *FROM    @tblCalendar

很抱歉麻烦您询问和编辑我的原始帖子。

答案1

小编典典

这是我的帖子的答案,以防万一将来像我这样的人会有同样的问题。

DECLARE@x int, @y int, @d date, @i date, @status Nvarchar(50)SET @X = 1 SET @y = 1SET @d = DATEADD (dd, 1 , ''31/Jul/2013'') -- ''2013/07/01'' --default date to AugustSET @status = ''Available''WHILE @X <= 868BEGINWHILE @Y <=28 AND @X <= 868--LOOP FOR SLOT COLUMN        BEGIN            INSERT INTO  tblCalendar (CalendarEntryID,Slot,Date,Status)            Values (@x, @y,@d,@status)            SET @x = @x + 1            SET @y = @y + 1            SET @i = @d        ENDSET @d = DATEADD (dd, 1 , @i) -- THIS WILL INCREMENT THE DATE ACCORDING TO SLOTSET @y = 1  ENDSELECT  *FROM    tblCalendar

SQL Server 2008中的while循环迭代日期范围,然后插入

SQL Server 2008中的while循环迭代日期范围,然后插入

我有一个带有几列的表,其中一列是Timestamp列。但是当前在此表中没有每天的记录。意思是,在“时间戳记”字段中有1月1日和1月2日的记录,但没有1月3日或1月4日的记录。但是,有记录持续到1月5日和1月6日,依此类推。基本上,周末和其他随机时间都丢失了。

我正在尝试编写一个脚本,该脚本将从StartDate扫描到EndDate(无论我选择的日期范围)是什么,并遍历该日期范围,并且如果该日期范围内的任何日期都不存在记录,则进行迭代,请在“时间戳记”字段中插入具有该特定日期的新记录,但在其余字段中插入空/
NULL数据。

这是到目前为止我得到的伪代码,我认为这是正确的方法:

DECLARE @StartDate AS DATETIMEDECLARE @EndDate AS DATETIMEDECLARE @CurrentDate AS DATETIMESET @StartDate = ''2015-01-01''SET @EndDate = GETDATE()SET @CurrentDate = @StartDateWHILE (@CurrentDate < @EndDate)BEGIN    SELECT * FROM myTable WHERE myTable.Timestamp = "@CurrentDate"    IF @@ROWCOUNT < 1        print @CurrentDate        /*insert a new row query here*/    SET @CurrentDate = convert(varchar(30), dateadd(day,1, @CurrentDate), 101); /*increment current date*/END

这是SQLFiddle- http:
//sqlfiddle.com/#!6/06c73/1

我正在SQL Server Management Studio 2008中编写我的第一个脚本,我认为可能适合中级用户。我是PHP /
MySQL开发人员,对这些技术非常熟悉,但是我是SQL和VBScript的新手。我了解编程的概念和逻辑,但这似乎与我习惯的有很大不同。

我非常感谢所有帮助和事先的见解!

答案1

小编典典

SQL是一种基于集合的语言,循环应是最后的选择。因此,基于集合的方法将是首先生成所需的所有日期并将其一次性插入,而不是一次循环插入一次。亚伦·伯特兰(Aaron
Bertrand)写了一系列很棒的文章,介绍如何生成没有循环的集合或序列:

  • 生成没有循环的集合或序列-第1部分
  • 生成没有循环的集合或序列-第2部分
  • 生成没有循环的集合或序列-第3部分

第3部分与日期特别相关。

假设您没有日历表,则可以使用堆叠的CTE方法来生成开始日期和结束日期之间的日期列表。

DECLARE @StartDate DATE = ''2015-01-01'',        @EndDate DATE = GETDATE();WITH N1 (N) AS (SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) n (N)),N2 (N) AS (SELECT 1 FROM N1 AS N1 CROSS JOIN N1 AS N2),N3 (N) AS (SELECT 1 FROM N2 AS N1 CROSS JOIN N2 AS N2)SELECT TOP (DATEDIFF(DAY, @StartDate, @EndDate) + 1)        Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY N) - 1, @StartDate)FROM N3;

由于链接文章中介绍了它的工作方式,因此我略过了一些细节,从本质上讲,它以10行的硬编码表开始,然后将其与自身连接以获得100行(10 x
10),然后与该表连接自身的100行以得到10,000行(我在这一点上已停止,但如果您需要更多行,则可以添加更多联接)。

在每一步中,输出都是一个单列N,其值为1(为简单起见)。在定义如何生成10,000行的同时,我实际上告诉SQL
Server仅使用生成所需的数字TOP以及开始日期和结束日期之间的差额- TOP(DATEDIFF(DAY, @StartDate,@EndDate) + 1)。这避免了不必要的工作。我必须在差异上加1以确保两个日期都包括在内。

使用排名功能,ROW_NUMBER()我在生成的每一行中添加一个增量数字,然后在您的开始日期中添加该增量数字以获取日期列表。由于ROW_NUMBER()从1开始,因此我需要从中减去1以确保包括开始日期。

那就只是排除使用已有的日期的情况NOT EXISTS。我已将上述查询的结果封装在名为CTE的自己的CTE中dates

DECLARE @StartDate DATE = ''2015-01-01'',        @EndDate DATE = GETDATE();WITH N1 (N) AS (SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) n (N)),N2 (N) AS (SELECT 1 FROM N1 AS N1 CROSS JOIN N1 AS N2),N3 (N) AS (SELECT 1 FROM N2 AS N1 CROSS JOIN N2 AS N2),Dates AS(   SELECT TOP (DATEDIFF(DAY, @StartDate, @EndDate) + 1)            Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY N) - 1, @StartDate)    FROM N3)INSERT INTO MyTable ([TimeStamp])SELECT  DateFROM    Dates AS dWHERE NOT EXISTS (SELECT 1 FROM MyTable AS t WHERE d.Date = t.[TimeStamp])

SQL小提琴上的示例


如果要创建日历表(如链接文章中所述),则可能不必插入这些额外的行,则可以即时生成结果集,例如:

SELECT  [Timestamp] = c.Date,        t.[FruitType],        t.[NumOffered],        t.[NumTaken],        t.[NumAbandoned],        t.[NumSpoiled]FROM    dbo.Calendar AS c        LEFT JOIN dbo.MyTable AS t            ON t.[Timestamp] = c.[Date]WHERE   c.Date >= @StartDateAND     c.Date < @EndDate;

附录

为了回答您的实际问题,您的循环将编写如下:

DECLARE @StartDate AS DATETIMEDECLARE @EndDate AS DATETIMEDECLARE @CurrentDate AS DATETIMESET @StartDate = ''2015-01-01''SET @EndDate = GETDATE()SET @CurrentDate = @StartDateWHILE (@CurrentDate < @EndDate)BEGIN    IF NOT EXISTS (SELECT 1 FROM myTable WHERE myTable.Timestamp = @CurrentDate)    BEGIN        INSERT INTO MyTable ([Timestamp])        VALUES (@CurrentDate);    END    SET @CurrentDate = DATEADD(DAY, 1, @CurrentDate); /*increment current date*/END

SQL小提琴上的示例

我不提倡这种方法,只是因为某件事只做一次就并不意味着我不应该证明这样做的正确方法。


进一步说明

由于堆叠的CTE方法可能会使基于集合的方法变得过于复杂,我将通过使用未记录的系统表来简化它master..spt_values。如果您运行:

SELECT NumberFROM master..spt_valuesWHERE Type = ''P'';

您将看到从0 -2047获得所有数字。

现在,如果您运行:

DECLARE @StartDate DATE = ''2015-01-01'',        @EndDate DATE = GETDATE();SELECT Date = DATEADD(DAY, number, @StartDate)FROM master..spt_valuesWHERE type = ''P'';

您可以获得从开始日期到将来的2047天的所有日期。如果添加其他where子句,则可以将其限制为结束日期之前的日期:

DECLARE @StartDate DATE = ''2015-01-01'',        @EndDate DATE = GETDATE();SELECT Date = DATEADD(DAY, number, @StartDate)FROM master..spt_valuesWHERE type = ''P''AND DATEADD(DAY, number, @StartDate) <= @EndDate;

现在,您已经在一个基于集合的查询中拥有了所有需要的日期,您可以使用以下方法消除表中已经存在的行: NOT EXISTS

DECLARE @StartDate DATE = ''2015-01-01'',        @EndDate DATE = GETDATE();SELECT Date = DATEADD(DAY, number, @StartDate)FROM master..spt_valuesWHERE type = ''P''AND DATEADD(DAY, number, @StartDate) <= @EndDateAND NOT EXISTS (SELECT 1 FROM MyTable AS t WHERE t.[Timestamp] = DATEADD(DAY, number, @StartDate));

最后,您可以使用以下命令将这些日期插入表格中 INSERT

DECLARE @StartDate DATE = ''2015-01-01'',        @EndDate DATE = GETDATE();INSERT YourTable ([Timestamp])SELECT Date = DATEADD(DAY, number, @StartDate)FROM master..spt_valuesWHERE type = ''P''AND DATEADD(DAY, number, @StartDate) <= @EndDateAND NOT EXISTS (SELECT 1 FROM MyTable AS t WHERE t.[Timestamp] = DATEADD(DAY, number, @StartDate));

希望这可以表明基于集合的方法不仅效率更高,而且更简单。

SQL Server 2008中进行性能数据收集

SQL Server 2008中进行性能数据收集

通过这个动手实验室,您可以了解到:了解与性能数据收集相关的组件及术语;创建并配置管理数据仓库;管理数据收集的类型及间隔;对收集上来的数据进行分析;创建自定义的数据收集类型。 1. 创建管理数据仓库 在SQL Server 2008中有很多组件可以进行性能数据收集

    通过这个动手实验室,您可以了解到:了解与性能数据收集相关的组件及术语;创建并配置管理数据仓库;管理数据收集的类型及间隔;对收集上来的数据进行分析;创建自定义的数据收集类型。

  1. 创建管理数据仓库

  在SQL Server 2008中有很多组件可以进行性能数据收集。为了设定收集数据的类型以及收集计划,数据收集器需要使用管理数据仓库。管理数据仓库也是一个关系型,但在创建该时很多默认设置需要进行修改,在我们后面的实验中将深入讨论。理想状态下,管理数据仓库最好和生产环境的数据库位于不同的上,以便实现更好的性能。

  数据收集所针对的目标是SQL Server 的实例,每一个实例都有收集组与之相对应,其中收集组指特定的收集类型,例如磁盘和查询统计。数据收集依靠SQL Server Agent 或SSIS按照计划来执行,因此作业和计划都会存储在msdb数据库中。管理数据仓库的角色就是存储数据、一些聚合值、以及针对系统分析而生成的历史信息。

  在第一个练习当中,我们将安装管理数据仓库:

  1. 打开 SQL Server Management Studio.

  依次点击Start | All Programs | Microsoft SQL Server 2008 | SQL Server Management Studio

  2. SQL Server Management Studio 打开以后,在Connect to Server 对话框中,输入如下信息,然后点击Connect:

  Server type: Database Engine

  Server name: CHICAGO\CONFIGSERVER

  Authentication: Windows Authentication

  3. 在Object Explorer中,依次展开Management 和Data Collection.

  4. 右键点击Data Collection 然后点击Configure Management Data Warehouse.

  5. 点击Next.

  6. 在配置Management Data Warehouse 时需要做两件事:创建SQL Server 数据库用于存储收集上来的数据计数;指定缓存文件夹,数据在加载到管理数据仓库之前会临时被缓存在这里。对于收集操作比较频繁的数据集,所收集的数据会在本地缓存,然后再批量导入到管理数据仓库,从而降低了网络负载并提高了数据收集时的性能。

  7. 在Configure Management Data Warehouse Wizard 页面中,选择Create or upgrade a management data warehouse 然后点击Next.

  8. 服务器名称会自动填写

  注意:你必须有足够的权限,以便在服务器中创建管理数据仓库。更多详细信息,请参考SQL Server 2008 Books Online 中的CREATE DATABASE (Transact-SQL) 以及Data Collector Security 部分

  9. 点击New新建管理数据仓库。

  按照下图所示进行设置。即将数据库名称设置为ManagementDW:

  

  10. 点击 OK 接收默认设置并创建ManagementDW 数据库。注意:即便在后面的步骤中取消向导,该数据库也将在该步骤中创建

  11. 点击Next.

sql-server – 如何在SQL Server 2008中使用GUID数据类型?

sql-server – 如何在SQL Server 2008中使用GUID数据类型?

我想使用sql SERVER 2008构建员工表,在我的表中,我想为每个员工创建一个ID.

我听说过GUID,我知道它的数据类型,但是我不能使用它

你能告诉我使用它的方式吗?

顺便说一下,让我说我想要这样的东西:

CREATE TABLE员工(
ID指导原则,
名称NVARCHAR(50)NOT NULL
)

我该怎么做 ??因为我想从中受益,但我无法找出如何做到这一点

解决方法

它在sql Server中不称为GUID.它叫做uniqueidentifier

sql-server – 如何在SQL Server 2008中分配整个Active Directory组安全访问?

sql-server – 如何在SQL Server 2008中分配整个Active Directory组安全访问?

我想在我的内部应用程序中使用集成安全性,这些应用程序都在域上.不幸的是,我从来没有能够让这个工作得很好.我想在sql Server中为整个Exchange(Active Directory)组分配一个角色,以便对某些表进行读/写访问.这样,每当有人被雇用时我都不必创建一个操作符,或者每当有人被解雇时都会删除一个操作符.这可能吗?我会采取什么步骤来做这件事?

解决方法

>将AD组设置为登录名.并且“登录”表示服务器级登录而不是用户/登录的AD概念.在sql Server中,这是服务器级主体
>创建一个映射用户.您不应该直接在表上允许用户.而“用户”是指数据库用户而不是用户的AD概念:在sql Server中,这是一个“数据库级别的主体”
>将用户添加到角色(也是“数据库级别主体”)
>对表上角色的GRANT权限(表或proc等是“安全”)

示例脚本

USE master;
GO
CREATE LOGIN [MYDOMAIN\APPLICATION SUPPORT] FROM WINDOWS;
GO
USE mydb;
GO
CREATE USER [MYDOMAIN\APPLICATION SUPPORT] FROM LOGIN [MYDOMAIN\APPLICATION SUPPORT];
GO
CREATE ROLE rSupport;
GO
EXEC sp_addrolemember 'rSupport','MYDOMAIN\APPLICATION SUPPORT';
GO
GRANT SELECT,INSERT,UPDATE,etc ON Mytable TO rSupport;
GO

从sql Server 2012开始,不推荐使用sp_addrolemember,而应使用ALTER ROLE.

关于如何在SQL Server 2008中进行两次while循环sqlserver的while循环的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于SQL Server 2008中的while循环迭代日期范围,然后插入、SQL Server 2008中进行性能数据收集、sql-server – 如何在SQL Server 2008中使用GUID数据类型?、sql-server – 如何在SQL Server 2008中分配整个Active Directory组安全访问?的相关知识,请在本站寻找。

本文标签: