sql server 2000 survival guide

Upload: babacar-ngom

Post on 02-Jun-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/11/2019 SQL Server 2000 Survival Guide

    1/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 1/49

    SQL Server Survival Guide

    Content

    SQL Server Architecture

    Physical Database Files and Filegroups

    Recovery Model

    Transaction Log Architecture

    Truncating the Transaction Log

    Log truncation occurs at these points

    The size of a transaction log is therefore controlled in one of these ways

    Shrinking the Transaction Log

    Example Truncating / Shrinking the Transaction Log

    Database is in FULL Recovery Mode Database is in SIMPLE Recovery Mode

    SQL Server Overview

    System and User Databases (= Oracle Schema)SQL Server ServicesReferring Objects

    Metadata (Data Dictionary)

    SQL Server Logon and Database Access

    SQL Server Query Designer

    SQL Server Batch Utility (osql)

    SQL Server Programming Overview

    Local VariablesDistributed Queries

    Formatting Dates

    CASE function (similar to Oracle DECODE)

    Dynamically constructing SQL Statements

    Transactions

    TOP n Queries

    Show User Tables for specified Database

    Show Primary- and Foreign Key of a Table

    Creating and Managing Databases

    Database Properties

    Change a property

    Create a Database

    Information on Databases

    Data Structures

    Database Recovery ModelCheck Extents, Pages

    Traceflags

    Backup a DatabaseRestore a Database

    Creating Tables

    User defined Data Types

    BLOBSComputed Columns

    Generate Column Value with Identity Property

    Generate Column Value with NEWID Function

    Create Table in specified File Group

    Generating Transact-SQL ScriptsLogged and Nonlogged Bulk Copies

    Data Integrity

    DEFAULT Constraint

    CHECK Constraint

    http://history.back%28%29/
  • 8/11/2019 SQL Server 2000 Survival Guide

    2/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 2/49

    PRIMARY KEY Constraint

    FOREIGN KEY Constraint

    DEFAULT Object

    RULE ObjectDisabling and Enabling Constraints

    Table Structure

    Pages and Extents

    Heaps and the Index Allocation Map (IAM)

    Index Structure

    Nonclustered Indexes

    Clustered Indexes

    Sysindexes Table

    Verify the sysindexes Table

    Full Table ScanNon Clustered Index Read

    Clustered Index Read

    Clustered Index with Non Clustered Index Read

    Page Splits in an Index

    Page Splits do not occur in a Heap

    Determining Selectitivity

    Determine Table Structures

    Optimizer Statistics

    Manually Creating Statistics

    Create Statistics for whole Database

    View Index Statistics and evaluating Index Selectivity

    Views

    Creating Views

    Encrypt / Decrypt Views

    Updateable Views

    Indexed Views

    Stored Procedures

    Populate Table with a Stored Procedure

    Check Stored Procedure Properties

    Recompile all Stored Procedures, Trigger that reference a Table

    Using Input Parameters

    Returning Values Using Output Parameters

    Process OUTPUT Value and RETURN Parameter

    Using last insert @@identity for Foreign Key Value

    Custom Messages from Stored Procedures added to EventlogEMail Interface

    Extended Stored Procedures

    User Defined Functions

    Scalar User Defined FunctionMulti-Statement Table-valued Function

    Triggers

    INSERT Triggers

    DELETE Triggers

    UPDATE Triggers

    Transact SQL Examples

    Shrinking the Logfile

    Handling NULLs

    COUNT(*)NULL Values in Foreign Keys

    SQL Server Architecture

    Microsoft SQL Server data is stored in databases. The data in a database is organized into the

  • 8/11/2019 SQL Server 2000 Survival Guide

    3/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 3/49

    logical components visible to users. A database is also physically implemented as two or more fileson disk.

    When using a database, you work primarily with the logical components such as tables, views,

    procedures, and users. The physical implementation of files is largely transparent. Typically, only

    the database administrator needs to work with the physical implementation.

    Each instance of SQL Server has four system databases ( master, model, tempdb, and msdb) and

    one or more user databases. Some organizations have only one user database, containing all the

    data for their organization. Some organizations have different databases for each group in their

    organization, and sometimes a database used by a single application. For example, an organization

    could have one database for sales, one for payroll, one for a document management application,and so on. Sometimes an application uses only one database other applications may access several

    databases.

    It is not necessary to run multiple copies of the SQL Server database engine to allow multiple users

    to access the databases on a server. An instance of the SQL Server is capable of handling thousands

    of users working in multiple databases at the same time. Each instance of SQL Server makes all

    databases in the instance available to all users that connect to the instance, subject to the defined

    security permissions.

    When connecting to an instance of SQL Server, your connection is associated with a particular

    database on the server. This database is called the current database. You are usually connected to

    a database defined as your default database by the system administrator.

    SQL Server allows you to detach databases from an instance of SQL Server, then reattach them to

    another instance, or even attach the database back to the same instance. If you have a SQL Server

    database file, you can tell SQL Server when you connect to attach that database file with a specific

    database name.

  • 8/11/2019 SQL Server 2000 Survival Guide

    4/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 4/49

    Physical Database Files and Filegroups

    Microsoft SQL Server maps a database over a set of operating-system files. Data and log

    information are never mixed on the same file, and individual files are used only by one database.

    SQL Server databases have three types of files:

    Primary data files

    The primary data file is the starting point of the database and points to theother files in the database. Every database has one primary data file. The

    recommended file name extension for primary

    data files is .mdf.

    Secondary data files

    Secondary data files comprise all of the data files other than the primary data

    file. Some databases may not have any secondary data files, while others

    have multiple secondary data files. The recommended file name extension for

    secondary data files is .ndf.

  • 8/11/2019 SQL Server 2000 Survival Guide

    5/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 5/49

    Log files

    Log files hold all of the log information used to recover the database. There

    must be at least one log file for each database, although there can be more

    than one. The recommended file name extension for log files is .ldf.

    SQL Server does not enforce the .mdf, .ndf, and .ldf file name extensions, but these extensions are

    recommended to help identify the use of the file.

    In SQL Server, the locations of all the files in a database are recorded in both the master databaseand the primary file for the database. Most of the time the database engine uses the file locationinformation from the master database. For some operations, however, the database engine uses

    the file location information from the primary file to initialize the file location entries in the master

    database.

    SQL Server files have two names:

    logical_file_name is a name used to refer to the file in all Transact-SQL

    statements.

    The logical file name must conform to the rules for SQL Server identifiers and

    must be unique to the database.

    os_file_name is the name of the physical file.

    It must follow the rules for Microsoft Windows NT or Microsoft Windows

    Me, and Microsoft Windows 98 file names.

    These are examples of the logical file names and physical file names of a database created on a

    default instance of SQL Server:

    SQL Server data and log files can be placed on either FAT or NTFS file systems, but cannot beplaced on compressed file systems.

    Use the following SQL Statement to list the logical and physical file names:

    USE MyDbSELECT SUBSTRING(name,1,20) Name, SUBSTRING(filename,1,50) Filename FROM dbo.sysfiles

    Name Filename

    -------------------- ------------------------------------MyDb_System E:\MsSQLServer\Data\MyDb_System.MDFMyDb_Log_1 E:\MsSQLServer\Data\MyDb_Log_1.LDFMyDb_Data_1 E:\MsSQLServer\Data\MyDb_Data_1.NDFMyDb_Index_1 E:\MsSQLServer\Data\MyDb_Index_1.NDF

    If you have a Backup and you would know, the logical and physical file names within this Backup,

  • 8/11/2019 SQL Server 2000 Survival Guide

    6/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 6/49

    then you can use RESTORE FILELISTONLY

    RESTORE FILELISTONLY FROMDISK = N'E:\MsSQLServer\Backup\MyDb.bak'

    WITH FILE = 7

    LogicalName PhysicalName----------------------------------------------------------------MyDb D:\sql2005\MSSQL.1\MSSQL\Data\MyDb.mdfMyDb_log C:\DATA\MyDb_log.ldf

    Recovery ModelSQL Server offers three recovery models for each database: full recovery, simple recovery and

    bulk-logged recovery. The recovery models determine how much data loss is acceptable in case of a

    failure and what types of backup and restore functions are allowed.

    Most people either select full or simple for all of their databases and just stick with the same option

    across the board. In most cases, selecting the full recovery model is the smartest option,because it gives you the greatest flexibility and minimizes data loss in the event a restore has to

    take place.

    Although using the full recovery model makes logical sense, there are reasons why the other two

    options are available. We will further define why there are three options and when you might want

    to use the different options to protect your databases. First, let's take a closer look at each model.

    Simple

    The simple recovery model allows you to recover data only to the most recent full database or

    differential backup. Transaction log backups are not available because the contents of thetransaction log are truncated each time a checkpoint is issued for the database.

    Full

    The full recovery model uses database backups and transaction log backups to provide complete

    protection against failure. Along with being able to restore a full or differential backup, you can

    recover the database to the point of failure or to a specific point in time. All operations, including

    bulk operations such as SELECT INTO, CREATE INDEX and bulk-loading data, are fully logged and

    recoverable.

    Bulk-Logged

    The bulk-logged recovery model provides protection against failure combined with the best

    performance. In order to get better performance, the following operations are minimally logged and

    not fully recoverable: SELECT INTO, bulk-load operations, CREATE INDEX as well as text and image

    operations. Under the bulk-logged recovery model, a damaged data file can result in having to redowork manually based on the operations that are not fully logged. In addition, the bulk-logged

    recovery model only allows the database to be recovered to the end of a transaction log backup

    when the log backup contains bulk changes.

    So once again, based on the information above it looks like the Full Recovery model is the way to

    go. Given the flexibility of the full recovery model, why would you ever select any other model? Thefollowing factors will help you determine when another model could work for you:

    Select Simple if:

    Your data is not critical.

    Losing all transactions since the last full or differential backup is not an issue.Data is derived from other data sources and is easily recreated.

    Data is static and does not change often.

    Select Bulk-Logged if:

    Data is critical, but logging large data loads bogs down the system.

    Most bulk operations are done off hours and do not interfere

    with normal transaction processing.You need to be able to recover to a point in time.

    Select Full if:

    Data is critical and no data can be lost.

    You always need the ability to do a point-in-time recovery.

  • 8/11/2019 SQL Server 2000 Survival Guide

    7/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 7/49

    Bulk-logged activities are intermixed with normal transaction processing.

    You are using replication and need the ability to resynchronize all

    databases involved in replication to a specific point in time.

    Switching recovery models

    For some databases, you may need to use a combination of these recovery models. Let's say you

    have a critical system and you cannot afford to lose any data during daily operations but during off

    hours there are maintenance tasks and data loads that use way too much transaction log space to

    log every transaction. In a case like this, you may want to switch recovery models prior to your

    maintenance tasks. This can be automated using T-SQL in the job that runs your maintenance ordata load tasks. After the maintenance task is completed, the recovery model can be switched backagain.

    Switching between full and bulk-logged models is probably the best scenario for changing recoverymodels and also the safest and easiest. You can switch from any recovery model to another

    recovery model, but prior to or after the switch, you may need to issue additional transaction log or

    full backups to ensure you have a complete backup set.

    ALTER DATABASE Northwind SET RECOVERY FULLGO

    Transaction Log Architecture

    Every Microsoft SQL Server 2000 database has a transaction log that records all transactionsand the database modifications made by each transaction. This record of transactions and their

    modifications supports three operations:

    Recovery of individual transactions

    If an application issues a ROLLBACK statement, or if SQL Server detects an

    error such as the loss of communication with a client, the log records are used

    to roll back the modifications made by an incomplete transaction.

    Recovery of all incomplete transactions when SQL Server is started.

    If a server running SQL Server fails, the databases may be left in a state

    where some modifications were never written from the buffer cache to the

    data files, and there may be some modifications from incomplete transactionsin the data files. When a copy of SQL Server is started, it runs a recovery of

    each database. Every modification recorded in the log which may not have

    been written to the data files is rolled forward. Every incomplete transaction

    found in the transaction log is then rolled back to ensure the integrity of the

    database is preserved.

    Rolling a restored database forward to the point of failure

    After the loss of a database, as is possible if a hard drive fails on a server

    that does not have RAID drives, you can restore the database to the point of

    failure. You first restore the last full or differential database backup, and then

    restore the sequence of transaction log backups to the point of failure. As you

    restore each log backup, SQL Server reapplies all the modifications recorded

    in the log to roll forward all the transactions. When the last log backup isrestored, SQL Server then uses the log information to roll back all

    transactions that were not complete at that point.

    Truncating the Transaction Log

    If log records were never deleted from the transaction log, the logical log would grow until it filled

    all the available space on the disks holding the physical log files. At some point in time, old logrecords no longer necessary for recovering or restoring a database must be deleted to make way

    for new log records. The process of deleting these log records to reduce the size of the logical log is

    called truncating the log.

    The active portion of the transaction log can never be truncated. The active portion of the log is thepart of the log needed to recover the database at any time, so must have the log images needed to

    roll back all incomplete transactions. It must always be present in the database in case the server

    fails because it will be required to recover the database when the server is restarted. The record at

    the start of the active portion of the log is identified by the minimum recovery log sequence number

    (MinLSN).

  • 8/11/2019 SQL Server 2000 Survival Guide

    8/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 8/49

    The recovery model chosen for a database determines how much of the transaction log in front of

    the active portion must be retained in the database. Although the log records in front of the MinLSN

    play no role in recovering active transactions, they are required to roll forward modifications when

    using log backups to restore a database to the point of failure. If you lose a database for some

    reason, you can recover the data by restoring the last database backup, and then restoring every

    log backup since the database backup. This means that the sequence of log backups must contain

    every log record that was written since the database backup. When you are maintaining a sequence

    of transaction log backups, no log record can be truncated until after it has been written to a logbackup.

    The log records before the MinLSN are only needed to maintain a sequence of transaction log

    backups.

    In the simple recovery model, a sequence of transaction logs is not being maintained. All log

    records before the MinLSN can be truncated at any time, except while a BACKUP statement is being

    processed. NO_LOG and TRUNCATE_ONLY are the only BACKUP LOG options that are valid for a

    database that is using the simple recovery model.

    In the full and bulk-logged recovery models, a sequence of transaction log backups is being

    maintained. The part of the logical log before the MinLSN cannot be truncated until those log records

    have been copied to a log backup.

    Log truncation occurs at these points

    At the completion of any BACKUP LOG statement.

    Every time a checkpoint is processed, provided the database is using the simplerecovery model. This includes both explicit checkpoints resulting from a

    CHECKPOINT statement and implicit checkpoints generated by the system. The

    exception is that the log is not truncated if the checkpoint occurs when a BACKUP

    statement is still active

    Transaction logs are divided internally into sections called virtual log files. Virtual log files are the

    unit of truncation. When a transaction log is truncated, all log records before the start of the

    virtual log file containing the MinLSN are deleted

    The size of a transaction log is therefore controlled in one of these ways

    When a log backup sequence is being maintained, schedule BACKUP LOG statements

    to occur at intervals that will keep the transaction log from growing past the desiredsize.

    When a log backup sequence is not maintained, specify the simple recovery model.

    This illustration shows a transaction log that has four virtual logs. The log has not been truncated

    after the database was created. The logical log starts at the beginning of the first virtual log and the

    part of virtual log 4 beyond the end of the logical file has never been used.

    This illustration shows how the log looks after truncation. The rows before the start of the virtual log

    containing the MinLSN record have been truncated.

  • 8/11/2019 SQL Server 2000 Survival Guide

    9/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 9/49

    Truncation does not reduce the size of a physical log file, it reduces the size of the logical log file.

    Shrinking the Transaction Log

    The size of the log files are physically reduced when:

    A DBCC SHRINKDATABASE statement is executed.

    A DBCC SHRINKFILE statement referencing a log file is executed.

    An autoshrink operation occurs

    Shrinking a log is dependent on first truncating the log. Log truncation does not reduce the size of a

    physical log file, it reduces the size of the logical log and marks as inactive the virtual logs that do

    not hold any part of the logical log. A log shrink operation removes enough inactive virtual logs toreduce the log file to the requested size.

    The unit of size reduction is a virtual log. For example, if you have a 600 MB log file that has beendivided into six 100 MB virtual logs, the size of the log file can only be reduced in 100 MB

    increments. The file size can be reduced to sizes such as 500 MB or 400 MB, but it cannot be

    reduced to sizes such as 433 MB or 525 MB.

    Virtual logs that hold part of the logical log cannot be freed. If all the virtual logs in a log file hold

    parts of the logical log, the file cannot be shrink until a truncation marks one or more of the virtuallogs at the end of the physical log as inactive.

    When any file is shrunk, the space freed must come from the end of the file. When a transaction logfile is shrunk, enough virtual logs from the end of the file are freed to reduce the log to the size

    requested by the user. The target_size specified by the user is rounded to the next highest virtual

    log boundary. For example, if a user specifies a target_size of 325 MB for our sample 600 MB file

    with 100 MB virtual log files, the last two virtual log files are removed and the new file size is 400

    MB.

    In SQL Server, a DBCC SHRINKDATABASE or DBCC SHRINKFILE operation attempts to shrink the

    physical log file to the requested size (subject to rounding) immediately:

    If no part of the logical log is in the virtual logs beyond the target_size mark, the

    virtual logs after the target_size mark are freed and the successful DBCC statement

    completes with no messages.

    If part of the logical log is in the virtual logs beyond the target_size mark, SQL

    Server frees as much space as possible and issues an informational message. The

    message tells you what actions you need to perform to get the logical log out of the

    virtual logs at the end of the file. After you perform this action, you can thenreissue the DBCC statement to free the remaining space.

    For example, assume that a 600 MB log file with six virtual logs has a logical log starting in virtual

    log 3 and ending in virtual log 4, when you execute a DBCC SHRINKFILE statement with atarget_size of 275 MB:

    Virtual logs 5 and 6 are freed immediately because they hold no portion of the logical log. To meet

    the specified target_size, however, virtual log 4 should also be freed, but cannot because it holds

    the end portion of the logical log. After freeing virtual logs 5 and 6, SQL Server fills the remaining

  • 8/11/2019 SQL Server 2000 Survival Guide

    10/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 10/49

    part of virtual log 4 with dummy records. This forces the end of the log file to virtual log 1. In most

    systems, all transactions starting in virtual log 4 will be committed within seconds, meaning that allof the active portion of the log moves to virtual log 1, and the log file now looks like this:

    The DBCC SHRINKFILE statement also issues an informational message that it could not free all the

    space requested, and indicate that you can execute a BACKUP LOG statement to make it possible to

    free the remaining space. Once the active portion of the log moves to virtual log 1, a BACKUP LOG

    statement will truncate the entire logical log that is in virtual log 4:

    Because virtual log 4 no longer holds any portion of the logical log, if you now execute the same

    DBCC SHRINKFILE statement with a target_size of 275 MB, virtual log 4 will be freed and the size of

    the physical log file reduced to the size requested.

    Example Shrinking the Transaction Log

    Here is an example how boths steps can be performed:

    Database is in FULL Recovery Mode# For this example we switch to FULL ModeUSE master

    ALTER DATABASE MyDb SET RECOVERY FULLGOThe command(s) completed successfully.

    # Add logical Devices for the Backup (The directories must exist!)EXEC sp_addumpdevice 'disk', 'MyDb_dat','C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyDb_dat.dat'GO(1 row(s) affected)'Disk' device added.

    EXEC sp_addumpdevice 'disk', 'MyDb_log','C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyDb_log.dat'GO(1 row(s) affected)'Disk' device added.

    # Create a Backup before Truncating / ShrinkingBACKUP DATABASE MyDb TO MyDb_datGOProcessed 26392 pages for database 'MyDb', file 'MigrationBasisplus_Data' on file 9.Processed 1 pages for database 'MyDb', file 'MigrationBasisplus_Log' on file 9.BACKUP DATABASE successfully processed 26393 pages in 9.756 seconds (22.161 MB/sec).

    BACKUP LOG MyDb TO MyDb_log

    GOProcessed 1 pages for database 'MyDb', file 'MigrationBasisplus_Log' on file 5.BACKUP LOG successfully processed 1 pages in 0.065 seconds (0.039 MB/sec).

    # Truncate the Transaction LogBACKUP LOG MyDb WITH TRUNCATE_ONLYGO

  • 8/11/2019 SQL Server 2000 Survival Guide

    11/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 11/49

    The command(s) completed successfully.

    # Drop logical Devicessp_dropdevice 'MyDb_dat'GODevice dropped.

    sp_dropdevice 'MyDb_log'GODevice dropped.

    # Get the Name of the Transaction LogUSE MyDbSELECT name FROM dbo.sysfilesGO

    # Shrink the physical Size of the Transaction Log to 20MBUSE MyDbDBCC SHRINKFILE (MigrationBasisplus_Log, 20)GO

    # Avoid a transaction log grows unexpectedlyUSE [master]GO

    ALTER DATABASE [MyDb] MODIFY FILE

    (NAME = N'MyDb_Log_1', SIZE = 772096KB, MAXSIZE = 921600KB , FILEGROWTH = 10240KB)GO

    Database is in SIMPLE Recovery Mode

    # For this example we switch to SIMPLE ModeUSE master

    ALTER DATABASE MyDb SET RECOVERY SIMPLEGOThe command(s) completed successfully.

    # Add logical Device for the Backup (The directories must exist!)EXEC sp_addumpdevice 'disk', 'MyDb_dat','C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyDb_dat.dat'

    GO(1 row(s) affected)'Disk' device added.

    # Create a Backup before Truncating / ShrinkingBACKUP DATABASE MyDb TO MyDb_datGOProcessed 26392 pages for database 'MyDb', file 'MigrationBasisplus_Data' on file 9.Processed 1 pages for database 'MyDb', file 'MigrationBasisplus_Log' on file 9.BACKUP DATABASE successfully processed 26393 pages in 9.756 seconds (22.161 MB/sec).

    # Truncate the Transaction LogBACKUP LOG MyDb WITH TRUNCATE_ONLYGO

    The command(s) completed successfully.

    # Drop logical Devicesp_dropdevice 'MyDb_dat'GODevice dropped.

    # Get the Name of the Transaction LogUSE MyDbSELECT name FROM dbo.sysfilesGOThe command(s) completed successfully.

    # Shrink the physical Size of the Transaction Log to 20MBUSE MyDbDBCC SHRINKFILE (MigrationBasisplus_Log, 20)GO

    SQL Server Overview

    System and User Databases (= Oracle Schema)

  • 8/11/2019 SQL Server 2000 Survival Guide

    12/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 12/49

    Master (Controls other Databases)

    Model (Template for new Databases)

    Tempdb (Temporary Storage)

    Msdb (Scheduling and Job Information)

    Distribution (Replication Information)

    SQL Server Services

    SQL Server includes four services

    MSSQLServer (Database Engine)

    SQLServerAgent (Job Scheduling)

    MS DTC, Distributed Transaction Coordinater (Distributed Queries, 2P Commit)

    Microsoft Search (Full Text Engine)

    Referring Objects

    select * from ...object

    select * from Northwind..customer (Owner is missing)

    Metadata (Data Dictionary)

    System Stored Procedures ( sp_ )

    sp_helpdb [db_name] Infos for Database

    sp_help [any object] Infos an Tables, Procedures, etc

    sp_helpindex [table_name] Show Indexes for table_name

    sp_who Show System Activity

    SELECT @@spid Which is my Server Process ID ?

    select user_name(),db_name(), @@servername Database User Name, Database,

    Server ?

    sp_helpdb Northwindsp_help Employees

    System Tables ( sys... )

    master..syslogins Available login Accounts

    master..sysmessages Available System Error / Warnings

    master..sysdatabases Available Databases on SQL Server

    sysusers Available Win 2000 Users, SQL Server Users

    sysobjects Available Objects in the Database

    use masterselect * from sysdatabases

    use northwindselect * from sysobjectswhere xtype = 'U'

    System Functions ( see QA: Common Objects )

    DB_ID(DbName) Get Database ID

    USER_NAME (id) Get UserName

    GETDATE() Get SystemDate

    use master

    select * from sysdatabases

    use northwindselect * from sysobjectswhere xtype = 'U'

    Schema Views ( System Table Independent Views)

  • 8/11/2019 SQL Server 2000 Survival Guide

    13/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 13/49

    select * from information_schema.tables Tables in a Database

    select * from information_schema.columns Columns in a Database

    select * from information_schema.table_privileges Privileges on Tables

    SQL Server Logon and Database Access

    1. Login Authentication (Windows Authentication or Mixed Mode)

    2. Mapping of OS User to Database User Accounts and Roles

    All W2K Administrators are automatically allowed to logon. This can be disabled by deletingthe \BUILTIN\Administrators in the Security Tab on SQL Server Level.

    Windows Authentication is the Default (Trusted Connection)

    Database Users

    Specific to SQL-Server, not the same as the Windows User or Login Account !

    Normally dbo is used, mapping is done on Database Level (EM: Users)

    Roles

    Fixed Server Roles (e.g. System Administrators = DBA) on SQL-Server Level

    Fixed Database Role (e.g. db_owner = Has all permissions in the database)

    Fixed server role Description

    sysadmin Can perform any activity in SQL Server.

    serveradmin Can set serverwide configuration options, shut down the

    server.

    setupadmin Can manage linked servers and startup procedures.

    securityadmin Can manage logins and CREATE DATABASE permissions,

    also read error logs and change passwords.

    processadmin Can manage processes running in SQL Server.

    dbcreator Can create, alter, and drop databases.

    diskadmin Can manage disk files.

    bulkadmin Can execute BULK INSERT statements.

    You can get a list of the fixed server roles from sp_helpsrvrole, and get the specific permissions for

    each role from sp_srvrolepermission.

    Fixed database role Description

    db_owner Has all permissions in the database.

    db_accessadmi n Can add or remove user IDs.

    db_securityadmin Can manage all permissions, object ownerships, roles and

    role memberships.

    db_ddladmin Can issue ALL DDL, but cannot issue GRANT, REVOKE, orDENY statements.

    db_backupoperator Can issue DBCC, CHECKPOINT, and BACKUP statements.

    db_datareader Can select all data from any user table in the database.

    db_datawriter Can modify any data in any user table in the database.

    db_denydatareader Cannot select any data from any user table in the

    database.

    db_denydatawriter Cannot modify any data in any user table in the database.

    Example

    USE NorthwindGOsp_addlogin @loginame = 'Akadia', @passwd = 'Akadia', @defdb = 'Northwind'GOsp_grantdbaccess 'Akadia'GOsp_addrole 'Masters'GO

  • 8/11/2019 SQL Server 2000 Survival Guide

    14/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 14/49

    sp_addrolemember 'Masters', 'Akadia'GOGRANT SELECT ON Employees TO MastersGO

    SQL Server Query Designer

    Query Designer can be used to graphicaly build a SQL statement, for example the syntax for an

    ANSI OUTER Join Syntax. Follow the following steps:

    1. Open Enterprise Manager

    2. Select a table in the desired Database / Tables

    3. Right-Click an select "Open Table / Query", the Query Designer opens.

    4. Right-Click an empty area on the diagram oane, and then click "Add Table"

    5. Choose another table, i n the SQL Pane you can now see the generated SQL statement

    6. For an OUTER Join, right-click the Relation and choose "All rows from "

    SQL Server Batch Utility (osql)

    The utility osql is a command line tool to run batches. For example you can create the CREDIT

    database as follows:

    osql /E /S /n /i creabase.sql >> credit.log

    /*

  • 8/11/2019 SQL Server 2000 Survival Guide

    15/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 15/49

    ** CREABASE.SQL**** Drop and Recreate the credit database.*/PRINT 'Begin CREABASE.SQL'GOUSE masterSET nocount ONGOIF db_id('credit') IS NOT NULL

    DROP DATABASE credit

    GOCREATE DATABASE [credit]

    ON PRIMARY (NAME = N'credit_Data',FILENAME = N'E:\MSSQL\Data\credit_Data.MDF',

    SIZE = 50,FILEGROWTH = 10%)

    LOG ON (NAME = N'credit_Log',FILENAME = N'E:\MSSQL\Data\credit_Log.LDF',

    SIZE = 1,FILEGROWTH = 10%)

    GOALTER DATABASE credit ADD FILEGROUP CreditTablesFGGO

    ALTER DATABASE credit ADD FILEGROUP CreditIndexesFGGOALTER DATABASE credit ADD FILE ( NAME = CreditTables, FILENAME = 'E:\MSSQL\Data\CreditTables.ndf', SIZE = 8MB, MAXSIZE = UNLIMITED, FILEGROWTH = 50MB ) TO FILEGROUP CreditTablesFGALTER DATABASE credit ADD FILE ( NAME = CreditIndexes, FILENAME = 'E:\MSSQL\Data\CreditIndexes.ndf',

    SIZE = 8MB, MAXSIZE = UNLIMITED, FILEGROWTH = 50MB ) TO FILEGROUP CreditIndexesFGGOPRINT ' 'IF db_id('credit') IS NOT NULL PRINT 'CREATED DATABASE "credit"'ELSE PRINT 'CREATE DATABASE "credit" FAILED'PRINT ' 'GO

    osql -S localhost -U zahn -P soladur -n -i Sample_Script2.sql

    USE NorthwindIF EXISTS (SELECT * FROM sysobjects WHERE type = 'U' AND name = 'Sample1') DROP TABLE sample1IF EXISTS (SELECT * FROM sysobjects WHERE type = 'V' AND name = 'Sample_View') DROP VIEW Sample_ViewGOCREATE TABLE Sample1 ( cust_no int NOT NULL, fname char(10) NOT NULL, lname char(15) NOT NULL )GOCREATE VIEW Sample_View AS SELECT cust_no, lname FROM Sample1GOINSERT Sample1 VALUES ( 100, 'Adam' , 'Barr' )INSERT Sample1 VALUES ( 200, 'John' , 'Chen' )INSERT Sample1 VALUES ( 300, 'Cindy' , 'Durkin' )INSERT Sample1 VALUES ( 400, 'Roger' , 'Harui' )

  • 8/11/2019 SQL Server 2000 Survival Guide

    16/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 16/49

    INSERT Sample1 VALUES ( 500, 'Ryan' , 'LaBrie' )SELECT * FROM Sample_View

    SQL Server Programming Overview

    Local Variables

    use northwindgodeclare @lastname varchar(20)

    declare @firstname varchar(20)set @lastname = 'Dodsworth'select @firstname = FirstName from employees where lastname = @lastnameprint @firstname + ' ' + @lastnamego

    Distributed Queries

    Perform a distributed query to retrieve information from the EMP table on Oracle 9.2.0 usind MAG1

    as the TNSNAMES.ORA connection string.

    1. Create the linked Server

    Specify Remote Login/Password (system/manager) in Linked Server Properties.

    EXEC sp_addlinkedserver @server = 'MAG1', @srvproduct = 'Oracle 9.2.0', @provider = 'MSDAORA', @datasrc = 'MAG1'GO

    2. Start Distributed Query using the SQL Pass Trough Function OPENQUERY

    SELECT * FROM OPENQUERY(MAG1,'SELECT * FROM scott.emp')GO

    Formatting Dates

    Use CONVERT() with date format number, see CONVERT()

    select convert(varchar(30), getdate, 104)--> 19.10.2002

    SET DATEFORMAT

    Sets the order of the dateparts (month/day/year) for entering datetime or smalldatetime data.

    SET DATEFORMAT mdyGO

    DECLARE @datevar smalldatetimeSET @datevar = '12/31/02 12:30:00'SELECT @datevarGO--> 2002-12-31 12:30:00

    CASE function (similar to Oracle DECODE)

    Within a SELECT statement, a simple CASE function allows only an equality check no other

    comparisons are made. This example uses the CASE function to alter the display of book categoriesto make them more understandable.

    USE pubsGOSELECT Category =

    CASE type WHEN 'popular_comp' THEN 'Popular Computing' WHEN 'mod_cook' THEN 'Modern Cooking' WHEN 'business' THEN 'Business' WHEN 'psychology' THEN 'Psychology' WHEN 'trad_cook' THEN 'Traditional Cooking'

  • 8/11/2019 SQL Server 2000 Survival Guide

    17/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 17/49

    ELSE 'Not yet categorized' END, CAST(title AS varchar(25)) AS 'Shortened Title', price AS PriceFROM titlesWHERE price IS NOT NULLORDER BY type, priceCOMPUTE AVG(price) BY typeGO

    Category Shortened Title Price

    ------------------- ------------------------- ---------------------Business You Can Combat Computer S 2.9900Business Cooking with Computers: S 11.9500Business The Busy Executive's Data 19.9900Business Straight Talk About Compu 19.9900 avg ===================== 13.7300

    SELECT au_fname, au_lname, CASE state WHEN 'CA' THEN 'California' WHEN 'KS' THEN 'Kansas' WHEN 'TN' THEN 'Tennessee' WHEN 'OR' THEN 'Oregon' WHEN 'MI' THEN 'Michigan' WHEN 'IN' THEN 'Indiana' WHEN 'MD' THEN 'Maryland' WHEN 'UT' THEN 'Utah' END AS StateNameFROM pubs.dbo.authorsORDER BY au_lname

    SELECT statement with simple and searched CASE function

    Within a SELECT statement, the searched CASE function allows values to be replaced in the result

    set based on comparison values. This example displays the price (a money column) as a text

    comment based on the price range for a book.

    USE pubsGOSELECT 'Price Category' =

    CASEWHEN price IS NULL THEN 'Not yet priced'

    WHEN price < 10 THEN 'Very Reasonable Title' WHEN price >= 10 and price < 20 THEN 'Coffee Table Title' ELSE 'Expensive book!' END, CAST(title AS varchar(20)) AS 'Shortened Title'FROM titlesORDER BY priceGO

    Price Category Shortened Title--------------------- --------------------Not yet priced The Psychology of CoNot yet priced Net EtiquetteVery Reasonable Title The Gourmet MicrowavVery Reasonable Title You Can Combat Compu

    Dynamically constructing SQL Statements

    Use EXECUTE with Literals and Variables

    Change Ownership of Tables in Database Northwind to dbo:

    use Northwind

    select 'EXECUTE sp_changeobjectowner ''' + name + ''', ''dbo''' from sysobjectswhere type = 'U'

    Dynamically construct and run a SELECT statement

    declare @dbname varchar(30)declare @tblname varchar(30)set @dbname = 'Northwind'

  • 8/11/2019 SQL Server 2000 Survival Guide

    18/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 18/49

    set @tblname = 'Products'EXECUTE('USE ' + @dbname + ' SELECT * FROM ' + @tblname)

    Transactions

    Transactions must be included in a BEGIN TRAN, COMMIT TRAN Block. Updated Rows in the block

    are locked for other sessions as long as the transaction is not commited. Open another QA and try

    to select, the select waits!

    USE Northwind

    BEGIN TRAN -- Lock Rows UPDATE Customers SET ContactName = 'Howard Snyder_Updated' WHERE CustomerID ='GREAL' IF (@@ERROR 0) BEGIN RAISERROR ('Transaction failed',16,-1) ROLLBACK TRANSACTION ENDCOMMIT TRANSACTION

    SELECT ContactName FROM Customers WHERE CustomerID = 'GREAL'

    TOP n Queries

    The TOP keyword specifies that the first n rows of the result set are returned. If ORDER BY is

    specified, the rows are selected after the result set is ordered. n is the number of rows to

    return, unless the PERCENT keyword is specified. PERCENT specifies that n is the percentage of rows

    in the result set that are returned. For example, this SELECT statement returns the first 10 cities, in

    alphabetic sequence, from the Orders table:

    SELECT DISTINCT TOP 10 ShipCity, ShipRegion FROM OrdersORDER BY ShipCity

    Show User Tables for specified Database

    use northwindselect * from information_schema.tableswhere table_type = 'BASE TABLE'

    Show Primary- and Foreign Key of a Table

    select * from information_schema.key_column_usagewhere table_name = 'Orders'

    Creating and Managing Databases

    Database Properties

    SELECT DATABASEPROPERTYEX('Northwind', 'IsAutoShrink')

    Value Description Value returned

    Collation Default collation name for the

    database.

    Collation name

    IsAnsiNullDefault Database foll ows SQL-92 rules

    for allowing null values.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsAnsiNullsEnabled All compari sons to a null

    evaluate to unknown.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsAnsiPaddingEnabled Strings are padded to the same

    length before comparison or

    insert.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsAnsiWarningsEnabled Error or warning messages are

    issued when standard error

    conditions occur.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

  • 8/11/2019 SQL Server 2000 Survival Guide

    19/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 19/49

    IsArithmeticAbortEnabled Queries are terminated when an

    overflow or divide-by-zero error

    occurs during query execution.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsAutoClose Database shuts down cleanly

    and frees resources after the

    last user exits.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsAutoCreateStatistics Existing statistics are

    automatically updated when the

    statistics become out-of-date

    because the data in the tables

    has changed.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsAutoShrink Database files are candidates

    for automatic periodic shrinking.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsAutoUpdateStatistics Auto update statistics database

    option is enabled.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsCloseCursorsOnCommitEnabled Cursors that are open when a

    transaction is committed are

    closed.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsFulltextEnabled Database is full-text enabled. 1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsInStandBy Database is online as read-only,

    with restore log allowed.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsLocalCursorsDefault Cursor declarations default to

    LOCAL.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsMergePublished The tables of a database can be

    published for replication, if

    replication is installed.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsNullConcat Null concatenation operand

    yields NULL.

    1 = TRUE

    0 = FALSE

    NULL = Invalid inputIsNumericRoundAbortEnabled Errors are generated when loss

    of precision occurs in

    expressions.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsQuotedIdentifiersEnabled Double quotation marks can be

    used on identifiers.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsRecursiveTriggersEnabled Recursive firing of triggers is

    enabled.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    IsSubscribed Database can be subscribed for

    publication.

    1 = TRUE

    0 = FALSE

    NULL = Invalid inputIsTornPageDetectionEnabled Microsoft SQL Server

    detects incomplete I/O

    operations caused by powerfailures or other system

    outages.

    1 = TRUE

    0 = FALSE

    NULL = Invalid input

    Recovery Recovery model for the

    database.

    FULL = full recovery

    model

    BULK_LOGGED = bulk

    logged model

    SIMPLE = simple

    recovery model

    SQLSortOrder SQL Server sort order ID

    supported in previous versions

    of SQL Server.

    0 = Database is using

    Windows collation

    >0 = SQL Server sort

    order ID

    Status Database status. ONLINE = database is

    available for query

    OFFLINE = database

  • 8/11/2019 SQL Server 2000 Survival Guide

    20/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 20/49

    was explicitly taken

    offline

    RESTORING =

    database is being

    restored

    RECOVERING =

    database is recovering

    and not yet ready forqueries

    SUSPECT = database

    cannot be recoveredUpdateability Indicates whether data can be

    modified.

    READ_ONLY = data

    can be read but not

    modifiedREAD_WRITE = data

    can be read and

    modified

    UserAccess Indicates which users can

    access the database.

    SINGLE_USER = only

    one db_owner,dbcreator, or

    sysadmin user at a

    time

    RESTRICTED_USER =

    only members of

    db_owner, dbcreator,

    and sysadmin roles

    MULTI_USER = all

    users

    Version Internal versi on number of the

    Microsoft SQL Server code with

    which the database was

    created. For internal use only by

    SQL Server tools and in upgradeprocessing.

    Version number =

    Database is open

    NULL = Database is

    closed

    Change a propertyUSE masterEXEC sp_dboption 'ClassNorthwind', 'auto create statistics', 'TRUE'

    Create a Database

    USE master

    /* Drop the ClassNorthwind Database if it already exists */IF DB_ID('ClassNorthwind') IS NOT NULLBEGIN DROP DATABASE ClassNorthwindEND

    /* Create the Database */CREATE DATABASE ClassNorthwind ON PRIMARY ( NAME = ClassNorthwind_SYS, FILENAME = 'C:\ClassNorthwind_SYS.mdf', SIZE = 5MB, MAXSIZE = 100MB, FILEGROWTH=10% )LOG ON ( NAME = ClassNorthwind_LOG, FILENAME = 'C:\ClassNorthwind_LOG.ldf', SIZE = 15MB, MAXSIZE = 40MB, FILEGROWTH = 10% )

    /* Create additional Filegroups */ALTER DATABASE ClassNorthwind

  • 8/11/2019 SQL Server 2000 Survival Guide

    21/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 21/49

    ADD FILEGROUP TAB

    ALTER DATABASE ClassNorthwind ADD FILEGROUP IDX

    ALTER DATABASE ClassNorthwind ADD FILE ( NAME = ClassNorthwind_TAB01, FILENAME = 'C:\ClassNorthwind_TAB01.ndf', SIZE = 1MB, MAXSIZE = UNLIMITED,

    FILEGROWTH = 50MB ) TO FILEGROUP TABALTER DATABASE ClassNorthwind ADD FILE ( NAME = ClassNorthwind_IDX01, FILENAME = 'C:\ClassNorthwind_IDX01.ndf', SIZE = 1MB, MAXSIZE = UNLIMITED, FILEGROWTH = 50MB ) TO FILEGROUP IDX

    /* Alter Default Filegroup */ALTER DATABASE ClassNorthwind MODIFY FILEGROUP [TAB] DEFAULT

    GO

    Information on Databases

    USE ClassNorthwind

    dbcc sqlperf (logspace)sp_helpfilegroup [TAB]

    EXEC sp_spaceused ''

    Data Structures

    All Databases have a primary data file (.MDF) and one or more Transaction log files (.LDF)A Database can have secondary data files (.NDF)

    Data is stored in 8KB blocks = Pages

    Rows cannot span Pages, thus the maximum amount of data in a single row is 8KB

    Extents are 8 contiguous Pages = 8x8 = 64KB

    Extents

    Mixed Extents = contains data of two or more tables

    Uniform Extents = contains data of one single table

    Secial Pages (in first extent of each file as mixed extent)

    File Header Page: File Attributs

    Page Free Space (PFS): Free Space in PageGlobal Allocation Map (GAM): Location of free Pages

    Secondary Global Allocation Map (SGAM)

    Index Allcation Map (IAM): Information about Extents that a Table or Index uses.

    Data Page: Normal Row Data other than text, ntext, image

    Text/Image Page: BLOBs

    Index Page: Index Structures

    Database Recovery Model

    SIMPLE: Transaction Log is overwritten when full

    FULL: Transaction Log must be backed up

    alter database ClassNorthwind set recovery simple

    alter database ClassNorthwind set recovery full

    Check Extents, Pages

    dbcc traceon(3604) /* Output to Screen */dbcc extentinfo (ClassNorthwind)

  • 8/11/2019 SQL Server 2000 Survival Guide

    22/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 22/49

    dbcc page (ClassNorthwind,1,75) /* 1=FileId, 75=PageId */

    Traceflags

    Trace flags are used to customize certain characteristics controlling how Microsoft SQL Server

    operates. Trace flags remain enabled in the server until disabled by executing a DBCC TRACEOFF

    statement. New connections into the server do not see any trace flags until a DBCC TRACEON

    statement is issued. Then, the connection will see all trace flags currently enabled in the server,

    even those enabled by another connection.

    Backup a Database

    osql -S -U -P -i backup.sql

    USE masterEXEC sp_dropdevice 'MyDb_dat'EXEC sp_dropdevice 'MyDb_log'EXEC sp_addumpdevice 'disk', 'MyDb_dat','C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyDb_dat.dat'EXEC sp_addumpdevice 'disk', 'MyDb_log','C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyDb_log.dat'BACKUP DATABASE MyDb TO MyDb_datBACKUP LOG MyDb WITH TRUNCATE_ONLYGO

    Device dropped.Device dropped.(1 row affected)'Disk' device added.(1 row affected)'Disk' device added.Processed 26392 pages for database 'MyDb', file 'MigrationBasisplus_Data'Processed 1 pages for database 'MyDb', file 'MigrationBasisplus_Log' on file 3.BACKUP DATABASE successfully processed 26393 pages in 9.719 seconds (22.245 MB/sec).

    Restore a Database

    osql -S -U -P -i restore.sql

    USE masterRESTORE DATABASE CreditFROM DISK = 'C:\CreditDB.BAK'WITH REPLACEGO

    Processed 112 pages for database 'Credit', file 'credit_Data' on file 1.Processed 984 pages for database 'Credit', file 'CreditTables' on file 1.Processed 144 pages for database 'Credit', file 'CreditIndexes' on file 1.Processed 1 pages for database 'Credit', file 'credit_Log' on file 1.RESTORE DATABASE successfully processed 1241 pages in 2.408 seconds (4.220 MB/sec)

    Creating Tables

    User defined Data Types

    User defined Data Types should not be used !

    BLOBS

    Text: CLOB (0-2 GB)

    NTEXT: Unicode CLOB (0-2GB)

    Image: BLOB (0-2GB)

    Blobs are nOT stored within row data, however this can accomplished with

    use NorthwindEXEC sp_tableoption N'Employees', 'text in row', 'ON'EXEC sp_tableoption N'Employees', 'text in row', '1000' /* 1000 Chars in Row */

    Computed Columns

  • 8/11/2019 SQL Server 2000 Survival Guide

    23/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 23/49

    Virtual Column that is not physically stored in the table, it is based on other Columns within the

    table.

    CREATE TABLE mylogintable ( date_in datetime, user_id int, remark varchar(20), remark_upper AS UPPER(RTRIM(remark)), user_name AS USER_NAME())

    Generate Column Value with Identity Property

    Creates an identity column in a table. This property is used with the CREATE TABLE and ALTER

    TABLE Transact-SQL statements (similar to Sequence in Oracle).

    Use @@IDENTITY to determine most recent value just after an INSERT.

    SCOPE_IDENTITY returns the last IDENTITY value inserted into an identitiy column in the same

    scope. A scope is a stored procedure, trigger function or batch.

    IDENT_CURRENT returns the last IDENTITY value inserted for a specified table in any session

    and any scope.

    Example

    USE ClassNorthwindGOCREATE TABLE table1(id int IDENTITY)CREATE TABLE table2(id int IDENTITY(100,1))GOCREATE TRIGGER table1ins ON table1 FOR INSERTAS BEGIN INSERT table2 DEFAULT VALUESENDGO-- end of trigger definition

    SELECT * FROM table1-- id is empty.

    SELECT * FROM table2-- id is empty.

    -- Do the following in Session 1INSERT table1 DEFAULT VALUESSELECT @@IDENTITY100-- Returns the value 100, which was inserted by the trigger.

    SELECT SCOPE_IDENTITY()1--Returns the value 1, which was inserted by the-- INSERT stmt 2 statements before this query.*/

    SELECT IDENT_CURRENT('table2')100-- Returns value inserted into table2, i.e. in the trigger.

    SELECT IDENT_CURRENT('table1')1--Returns value inserted into table1, which was-- the INSERT statement 4 stmts before this query.

    -- Do the following in Session 2SELECT @@IDENTITY--Returns NULL since there has been no INSERT action

    -- so far in this session.

    SELECT SCOPE_IDENTITY()--Returns NULL since there has been no INSERT action-- so far in this scope in this session.

    SELECT IDENT_CURRENT('table2')

  • 8/11/2019 SQL Server 2000 Survival Guide

    24/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 24/49

    100--Returns the last value inserted into table2

    SET IDENTITY_INSERT

    Allows explicit values to be inserted into the identity column of a table.

    USE ClassNorthwindGO-- Create products table.CREATE TABLE products (id int IDENTITY(1,1) PRIMARY KEY,

    product varchar(40))GO-- Inserting values into products table.INSERT INTO products (product) VALUES ('screwdriver')INSERT INTO products (product) VALUES ('hammer')INSERT INTO products (product) VALUES ('saw')INSERT INTO products (product) VALUES ('shovel')GO

    -- Get last inserted keySELECT @@identity

    -- Create a gap in the identity values.DELETE productsWHERE product = 'saw'GO

    SELECT *FROM productsGO

    -- Attempt to insert an explicit ID value of 3-- should return a warning:-- Cannot insert explicit value for identity column in table 'products'-- when IDENTITY_INSERT is set to OFF.

    INSERT INTO products (id, product) VALUES(3, 'garden shovel')GO-- SET IDENTITY_INSERT to ON.

    SET IDENTITY_INSERT products ONGO

    -- Attempt to insert an explicit ID value of 3-- SuccessfullINSERT INTO products (id, product) VALUES(3, 'garden shovel')GO

    SELECT *FROM productsGO

    Generate Column Value with NEWID Function

    Creates a unique value of type uniqueidentifier.

    -- Creating a local variable with DECLARE/SET syntax.USE ClassNorthwindDECLARE @myid uniqueidentifierSET @myid = NEWID()PRINT 'Value of @myid is: '+ CONVERT(varchar(255), @myid)GO

    -- Create Table using NEWID()CREATE TABLE cust( cust_id uniqueidentifier NOT NULL DEFAULT newid(), company varchar(30) NOT NULL,

    contact_name varchar(60) NOT NULL, address varchar(30) NOT NULL, city varchar(30) NOT NULL, state_province varchar(10) NULL, postal_code varchar(10) NOT NULL, country varchar(20) NOT NULL, telephone varchar(15) NOT NULL,

  • 8/11/2019 SQL Server 2000 Survival Guide

    25/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 25/49

    fax varchar(15) NULL)GO-- Inserting data into cust table.INSERT cust (cust_id, company, contact_name, address, city, state_province, postal_code, country, telephone, fax)VALUES (newid(), 'Wartian Herkku', 'Pirkko Koskitalo', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland', '981-443655', '981-443655')

    Create Table in specified File Group

    USE ClassNorthwind

    -- Check if Table existsIF OBJECT_ID('Employees') IS NOT NULL DROP TABLE dbo.EmployeesGO

    -- Create Table in TAB FilegroupCREATE TABLE Employees ( EmployeeID int IDENTITY (1, 1) NOT NULL , LastName nvarchar (20) NOT NULL , FirstName nvarchar (10) NOT NULL ,

    ) ON [TAB]GO

    Generating Transact-SQL Scripts

    1. Open EM

    2. Select a Database

    3. Right-Click, All Tasks, Generate SQL Script

    select * from dbo.sysobjects where id = object_id(N'[dbo].[Region]') and OBJECTPROPERTY(id, N'IsUserTable') = 1

    Logged and Nonlogged Bulk Copies

    The difference between logged and nonlogged bulk copy operations is how much information is

    logged. Both logged and nonlogged bulk copy operations can be rolled back, but only a logged bulk

    copy operation can be rolled forward.

    In a logged bulk copy all row insertions are logged, which can generate many log records in a large

    bulk copy operation. These log records can be used to both roll forward and roll back the logged

    bulk copy operation. In a nonlogged bulk copy, only the allocations of new pages to hold the bulk

    copied rows are logged.

    USE masterGOexec sp_dboption ClassNorthwind,'select into/bulkcopy',trueGOUSE ClassNorthwindSET NOCOUNT ONGO... Do Bulk Insert

    Data Integrity

    DEFAULT Constraint

    USE ClassNorthwind

    /* Drop the constraint if it already exists */IF OBJECT_ID('DF_Region') IS NOT NULL

    BEGIN ALTER TABLE Employees DROP CONSTRAINT DF_RegionENDGO

    /* Add the constraint */ALTER TABLE Employees

  • 8/11/2019 SQL Server 2000 Survival Guide

    26/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 26/49

    ADD CONSTRAINT DF_Region DEFAULT 'NY' FOR RegionGO

    CHECK Constraint

    /*Adds a CHECK CONTSTRAINT to verify that the employeebirth date is less than today's date.*/USE ClassNorthwind

    ALTER TABLE Employees ADD CONSTRAINT CK_BirthDate CHECK (BirthDate < GETDATE())GO

    PRIMARY KEY Constraint

    A UNIQUE Index is automatically created. You can specify a clustered or nonclustered index

    (clustered is the default). A clustered index is the same as a IOT (index organized Table) in Oracle.

    Table data is physically sorted. Only one clustered index is possible per table.

    /*Adds a PRIMARY KEY CONTSTRAINT to the Cumtomers table.*/USE ClassNorthwind

    ALTER TABLE Customers ADD CONSTRAINT PK_Customers PRIMARY KEY NONCLUSTERED (CustomerID)GO

    FOREIGN KEY Constraint

    /*Adds a foreign key constraint to the Orders table inthe ClassNorthwind database.

    If this is a rerun (and the constraint already exists), firstdrop the constraint.

    Use the ClassNorthwind database and set NOCOUNT on to eliminatethe message indicating the number of rows affected.*/

    USE ClassNorthwindSET NOCOUNT ONGO

    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = 'dbo' AND CONSTRAINT_NAME = 'FK_Orders_Customers' AND CONSTRAINT_TYPE = 'FOREIGN KEY') ALTER TABLE dbo.Orders DROP CONSTRAINT FK_Orders_CustomersGO

    ALTER TABLE dbo.Orders ADD CONSTRAINT FK_Orders_Customers FOREIGN KEY(CustomerID) REFERENCES dbo.Customers(CustomerID)GO

    /* Reset NOCOUNT */SET NOCOUNT ONGO

    DEFAULT Object

    Independent of a Table, can be attached to any Table

    /*Creates a default for the ClassNorthwind database.*/USE ClassNorthwind

    /* If the default object already exists, drop it */IF OBJECT_ID('DF_Country') IS NOT NULL

  • 8/11/2019 SQL Server 2000 Survival Guide

    27/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 27/49

    BEGIN EXEC sp_unbindefault 'dbo.Suppliers.Country' DROP DEFAULT DF_CountryENDGO

    /* Create the Default Object */CREATE DEFAULT DF_Country AS 'Singapore'GO

    /* Bind the Default Object to the Suppliers.Country column */

    EXEC sp_bindefault DF_Country, 'dbo.Suppliers.Country'GO

    RULE Object

    Independent of a Table, can be attached to any Table. Rules uses variables, because column name

    is not known when you create the rule.

    /*Creates the phone number rule for the ClassNorthwind database.*/USE ClassNorthwind

    -- If the rule already exists, unbind and drop it.

    IF OBJECT_ID('R_PhotoPath') IS NOT NULLBEGIN EXEC sp_unbindrule 'dbo.Employees.PhotoPath' DROP RULE R_PhotoPathENDGO

    -- Create and bind the Rule.CREATE RULE R_PhotoPath AS @PhotoPath LIKE 'http://www.akadia.%'GOEXEC sp_bindrule R_PhotoPath, 'dbo.Employees.PhotoPath'GO

    -- OKUPDATE Employees SET PhotoPath = 'http://www.akadia.com' WHERE LastName = 'Fuller'GO

    -- OKUPDATE Employees SET PhotoPath = 'http://www.akadia.com' WHERE LastName = 'Fuller'GO

    -- NOT OKUPDATE Employees SET PhotoPath = 'http://www.arkum.com' WHERE LastName = 'Fuller'GO

    Disabling and Enabling Constraints

    Applies to CHECK and FOREIGN KEY Constraints only.

    USE ClassNorthwindGOALTER TABLE Orders NOCHECK CONSTRAINT FK_Orders_CustomersGOALTER TABLE Orders CHECK CONSTRAINT FK_Orders_CustomersGO

    Table Structure

    Pages and Extents

  • 8/11/2019 SQL Server 2000 Survival Guide

    28/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 28/49

    The actual data in your table is stored in Pages, except BLOB data. If a column contain BLOB data

    then a 16 byte pointer is used to reference the BLOB page. The Page is the smallest unit of data

    storage in Microsoft SQL Server . A page contains the data in the rows. A row can only reside in

    one page. Each Page can contain 8KB of information, due to this, the maximum size of a Row is8KB. A group of 8 adjacent pages is called an extent. A heap is a collection of data pages.

    Heaps and the Index Allocation Map (IAM)

    Heaps have one row in sysindexes with indid = 0. The column sysindexes.FirstIAM points to the

    first IAM page in the chain of IAM pages that manage the space allocated to the heap. Microsoft

    SQL Server 2000 uses the IAM (Index Allocation Map) pages to navigate through the heap. Thedata pages and the rows within them are not in any specific order, and are not linked together.The only logical connection between data pages is that recorded in the IAM pages.

    Index Structure

    All SQL Server indexes are B-Trees. There is a single root page at the top of the tree, branching

    out into N number of pages at each intermediate level until it reaches the bottom, or leaf level, of

    the index. The index tree is traversed by following pointers from the upper-level pages down

    through the lower-level pages. In addition, each index level is a separate page chain.There may be

    many intermediate levels in an index. The number of levels is dependent on the index key width,

    the type of index, and the number of rows and/or pages in the table. The number of levels is

    important in relation to index performance.

    Nonclustered Indexes

    A nonclustered index is analogous to an index in a textbook. The data is stored in one place,

    the index in another, with pointers to the storage location of the data. The items in the index are

    stored in the order of the index key values, but the information in the table is stored in a different

    order (which can be dictated by a clustered index). If no clustered index is created on the table, the

    rows are not guaranteed to be in any particular order.

  • 8/11/2019 SQL Server 2000 Survival Guide

    29/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 29/49

    Similar to the way you use an index in a book, Microsoft SQL Server 2000 searches for a data

    value by searching the nonclustered index to find the location of the data value in the table and then

    retrieves the data directly from that location. This makes nonclustered indexes the optimal

    choice for exact match queries because the index contains entries describing the exact location inthe table of the data values being searched for in the queries. If the underlying table is sorted using

    a clustered index, the location is the clustering key value otherwise, the location is the row ID

    (RID) comprised of the file number, page number, and slot number of the row. For example, to

    search for an employee ID (emp_id) in a table that has a nonclustered index on the emp_id column,

    SQL Server looks through the index to find an entry that lists the exact page and row in the table

    where the matching emp_id can be found, and then goes directly to that page and row.

    Considerations

    Consider using nonclustered indexes for:

    Columns that contain a large number of distinct values, such as a combination oflast name and first name (if a clustered index is used for other columns). If there

    are very few distinct values, such as only 1 and 0, most queries will not use the

    index because a table scan is usually more efficient.

    Queries that do not return large result sets.

    Columns frequently involved in search conditions of a query (WHERE clause) that

    return exact matches.

    Decision-support-system applications for which joins and grouping are frequently

    required. Create multiple nonclustered indexes on columns involved in join and

    grouping operations, and a clustered index on any foreign key columns.

    Covering all columns from one table in a given query. This eliminates accessing the

    table or clustered index altogether.

    Clustered Indexes

    A clustered index determines the physical order of data in a table. A clustered index is analogous

    to a telephone directory, which arranges data by last name. Because the clustered index

    dictates the physical storage order of the data in the table, a table can contain only one clustered

    index. However, the index can comprise multiple columns (a composite index), like the way a

    telephone directory is organized by last name and first name. Clustered Indexes are very similar toOracle's IOT's (Index-Organized Tables).

  • 8/11/2019 SQL Server 2000 Survival Guide

    30/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 30/49

    A clustered index is particularly efficient on columns that are often searched for ranges of

    values. After the row with the first value is found using the clustered index, rows with subsequent

    indexed values are guaranteed to be physically adjacent. For example, if an application frequently

    executes a query to retrieve records between a range of dates, a clustered index can quickly locate

    the row containing the beginning date, and then retrieve all adjacent rows in the table until the lastdate is reached. This can help increase the performance of this type of query. Also, if there is a

    column(s) that is used frequently to sort the data retrieved from a table, it can be advantageous to

    cluster (physically sort) the table on that column(s) to save the cost of a sort each time the

    column(s) is queried.

    Clustered indexes are also efficient for finding a specific row when the indexed value is unique. For

    example, the fastest way to find a particular employee using the unique employee ID columnemp_id is to create a clustered index or PRIMARY KEY constraint on the emp_id column.

    Note PRIMARY KEY constraints create clustered indexes automatically if no clustered index

    already exists on the table and a nonclustered index is not specified when you create the PRIMARY

    KEY constraint.

    Considerations

    It is important to define the clustered index key with as few columns as possible . If a large

    clustered index key is defined, any nonclustered indexes that are defined on the same table will be

    significantly larger because the nonclustered index entries contain the clustering key.

    Consider using a clustered index for:

    Columns that contain a large number of distinct values.

    Queries that return a range of values using operators such as BETWEEN, >, >=,

  • 8/11/2019 SQL Server 2000 Survival Guide

    31/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 31/49

    Wide keys

    The key values from the clustered index are used by all nonclustered indexes

    as lookup keys and therefore are stored in each nonclustered index leaf entry.

    Sysindexes Table

    The sysindexes table is a central location for information about tables and indexes. It contains

    statistical information, such as the number of rows and data pages in each table. It describes how to

    find information stored in a data table.

    Contains one row for each index and table in the database. This table is stored in each database.

    Column name Data type Description

    id int ID of table (for indid = 0 or 255). Otherwise, ID

    of table to which the index belongs.

    status int Internal system-status information.

    first binary(6) Pointer to the first or root page.

    indid smallint ID of index:

    0 = Heap = Table Data (not Index)

    1 = Clustered Index

    2 ... 254 = Nonclustered Index255 = Entry for tables that have text or image

    data

    root binary(6) For indid >= 1 and < 255, root is the pointer to

    the root page. For indid = 0 or indid = 255, root

    is the pointer to the last page.

    minlen smallint Minimum size of a row.

    keycnt smallint Number of keys.

    groupid smallint Filegroup ID on which the object was created.

    dpages int For indid = 0 or indid = 1, dpages is the count ofdata pages used. For indid=255, it is set to 0.

    Otherwise, it is the count of index pages used.

    reserved int For indid = 0 or indid = 1, reser ved is the countof pages allocated for all indexes and table data.

    For indid = 255, reserved is a count of the pages

    allocated for text or image data. Otherwise, it is

    the count of pages allocated for the index.

    used int For indid = 0 or indid = 1, used is the count of

    the total pages used for all index and table data.

    For indid = 255, used is a count of the pages

    used for text or image data. Otherwise, it is the

    count of pages used for the index.

    rowcnt bigint Data-level rowcount based on indid = 0 and indid= 1. For indid = 255, rowcnt is set to 0.

    rowmodctr int Counts the total number of inserted, deleted, orupdated rows since the last time statistics were

    updated for the table.

    xmaxlen smallint Maximum size of a row.

    maxirow smallint Maximum size of a nonleaf index row.

    OrigFillFactor tinyint Original fillf actor value used when the index was

    created. This value is not maintained however,

    it can be helpful if you need to re-create an

    index and do not remember what fillfactor wasused.

    reserved1 tinyint Reserved.

    reserved2 int Reserved.

    FirstIAM binary(6) Reserved.

    impid smallint Reserved. Index implem entation flag.

    lockflags smallint Used to constrain the considered lock

    granularities for an index. For example, a lookup

    table that is essentially read-only could be set up

  • 8/11/2019 SQL Server 2000 Survival Guide

    32/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 32/49

    to do only table level locking to minimize locking

    cost.

    pgmodctr int Reserved.

    keys varbinary(816) List of the column IDs of the columns that makeup the index key.

    name sysname Name of table (for indid = 0 or 255). Otherwise,name of index.

    statblob image Statistics BLOB.

    maxlen int Reserved.

    rows int Data-level rowcount based on indid = 0 and indid= 1, and the value is repeated for indid >1. For

    indid = 255, rows is set to 0. Provided for

    backward compatibility.

    Verify the sysindexes Table

    /*** Create a nonclustered index on the CustomerID column** in the Orders table of the ClassNorthwind database.**** This script checks for the existance of the** Orders_Customers_link index.

    ** If it exists we will drop it first then create it.*/USE ClassNorthwindSET NOCOUNT ONGO

    /*** If the objects already exist (i.e. if this is a rebuild), drop them.*/IF EXISTS (SELECT name FROM sysindexes WHERE name = 'Orders_Customers_link') DROP INDEX Orders.Orders_Customers_linkGO

    /* Create the Index with a FILLFACTOR of 75 */CREATE NONCLUSTERED INDEX Orders_Customers_link ON Orders(CustomerID) WITH FILLFACTOR = 75GO

    SET NOCOUNT OFFGO

    /*** This script queries the sysindexes system table.** It joins to the sysobjects table to get the table names.** It selects only the user defined tables (those with** an id greater than 100.)*/

    USE ClassNorthwindGO

    SELECT t.name AS [Table Name], i.name AS [Index Name], i.* FROM sysobjects AS t JOIN sysindexes AS i ON t.id = i.id WHERE t.id > 100ORDER BY t.name

    SELECT t.name AS [Table Name], i.name AS [Index Name], i.* FROM sysobjects AS t JOIN sysindexes AS i ON t.id = i.id WHERE i.name = 'Orders_Customers_link'

    TableName = OrdersIndexName = Orders_Customers_link

    id = 869578136indid = 3minlen = 19keycnt = 2groupid = 2dpages = 4reserved = 6

  • 8/11/2019 SQL Server 2000 Survival Guide

    33/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 33/49

    used = 6rowcnt = 830xmaxlen = 36maxirow = 42OrigFillFactor = 75FirstIAM = 0x7E0000000300

    Full Table Scan

    1. Lookup SYSINDEXES Table for given Table

    2. INDID = 0, FirstIAM points to IAM

    3. Lookup Extents with BitMap = 1 for this Table in IAM

    4. Read all Extents on Disk, Rows are returned unsorted

    Non Clustered Index Read

    1. Lookup SYSINDEXES Table for given Table

    2. INDID = 2 ... 254, read ROOT column for Root Index to find Non-Leaf Level of Non

    Clustered Index

    3. Lookup RID (RowId) in Leaf Level (Key Values). Each RID consists of File-ID, Page-No,

    Row-No (4:706:02)

    4. Read only those Rows from Heap which are needed.

    Clustered Index Read

    1. Lookup SYSINDEXES Table for given Table

    2. INDID = 1, read ROOT column for Root Index to find Non-Leaf Level of Clustered Index

    3. Read needed Leaf Level Rows. The data rows of a clustered index are sorted and stored in a

    sequential order based on their clustered key.

    Clustered Index with Non Clustered Index Read

    When a nonclustered index is added to a table that already has a clustered index, the row locator of

    each nonclustered index contains the clustered key index value for the row.

    1. Lookup SYSINDEXES Table for given Table

    2. INDID = 2 ... 254, read ROOT column for Root Index to find Non-Leaf Level of Non

    Clustered Index

    3. Lookup Clustered Key Value in Leaf Level of Non-clustered Index

    4. Lookup Root Index to find Non-Leaf Level of Clustered Index

    5. Read needed Leaf Level Rows. The data rows of a clustered index are sorted and stored in a

    sequential order based on their clustered key.

    Page Splits in an Index

    Occurs if data page or index page does not have enough room to accommodate the data, a

    new page is added in a process known as a page split.

    Approximately half of the data remains on the old page and the other half is moved to the

    new page.

    Page Splits do not occur in a Heap

    Forwarding Pointers handles updates to a row in a heap which needs more room than is

    currently available on that page. The row is moved to a new data page.

    The row leaves a forwarding pointer in its original location.

    Determining Selectitivity

  • 8/11/2019 SQL Server 2000 Survival Guide

    34/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 34/49

    High Selectivity: Low Value in % for Number of Rows meeting criteria / Total number of Rows in

    Table (e.g. 5%)

    Low Selectivity: High Value in % for Number of Rows meeting criteria / Total number of Rows in

    Table (e.g. 90%)

    Density is another concept for measuring the selectivity:

    High Selectivity = Low Density

    Low Selectivity = High Density

    Determine Table Structures (e.g. tablename = 'member')

    Number of Rows

    EXEC sp_spaceused 'member'10'000

    Displays fragmentation information for the data and indexes of the specified table

    DBCC SHOWCONTIG ('member')

    DBCC SHOWCONTIG scanning 'member' table...Table: 'member' (2025058250) index ID: 0, database ID: 9TABLE level scan performed.

    - Pages Scanned................................: 145- Extents Scanned..............................: 19- Extent Switches..............................: 18- Avg. Pages per Extent........................: 7.6- Scan Density [Best Count:Actual Count].......: 100.00% [19:19]- Extent Scan Fragmentation ...................: 0.00%- Avg. Bytes Free per Page.....................: 95.6- Avg. Page Density (full).....................: 98.82%

    Number of Rows per Page

    = Number of Rows / Pages Scanned = 10'000 / 145 = 68

    Number of Extens

    Extent Switches = 18

    Number of Indexes

    SELECT * FROM sysindexes WHERE id = OBJECT_ID('member')

    Number of clustered Index Pages (sysindexes: used)

    /* create a clustered index on the member table and note the changes */CREATE UNIQUE CLUSTERED INDEX mem_no_CL ON member (member_no)SELECT * FROM sysindexes WHERE id = OBJECT_ID('member')

    used: 147

    Number of data pages in the clustered index (sysindexes: dpages)

    dpages = 145

    Number of non-data pages in the clustered index (used - dpages)

    used - dpages = 147 - 145 = 2

    Number of pages in non-clustered index (used for index: indid = 2)

    /* Now create a nonclustered index and note the changes */CREATE NONCLUSTERED INDEX indx_fname ON member(firstname)SELECT * FROM sysindexes WHERE id = OBJECT_ID('member')

    used: 35

    Number of pages in the leaf level for non-clustered index (dpages for index: indid = 2)

    dpages: 33

    Approximate number of rows per leaf page for non-clustered index

    # rows in table/# leaf-level pages = 10'000 / 33 = 303

  • 8/11/2019 SQL Server 2000 Survival Guide

    35/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 35/49

    Optimizer Statistics

    Can be created on indexes and on Table Columns

    Sampling Statistics is randomly selecting data pages from a table

    FULLSCAN gathers all data

    Statistics are stored in the statblob column of the sysindexes system table

    Usually Statistics are collected automatically (see: Database Options, Auto create statistics)

    Manually Creating Statistics

    Can be useful when you have a column that may not benefit from an index, but statistics on that

    column may be useful for creating more optimal execution plans. Having statistics on those columns

    eliminates the overhead of an index.

    SET ClassNorthwindGO

    CREATE STATISTICS ST_Company ON Customers (CompanyName, ContactName) WITH SAMPLE 50 PERCENTGO

    CREATE STATISTICS ST_Contact ON Customers (ContactName) WITH FULLSCANGOSELECT * FROM sysindexes WHERE id = OBJECT_ID('Customers')GODROP STATISTICS Customers.ST_ContactGODROP STATISTICS Customers.ST_CompanyGO

    Create Statistics for whole Database

    Creates single-column statistics for all eligible columns for all user tables in the current database.The Stored Procedure index_cleanup is used because there is no sp_dropstats.

    USE ClassNorthwindGO/* Remove Statistics from each Table in the database */EXEC index_cleanup CategoriesEXEC index_cleanup CustomerCustomerDemoEXEC index_cleanup CustomerDemographicsEXEC index_cleanup CustomersEXEC index_cleanup EmployeesEXEC index_cleanup EmployeeTerritoriesEXEC index_cleanup [Order Details]EXEC index_cleanup Orders

    EXEC index_cleanup ProductsEXEC index_cleanup RegionEXEC index_cleanup ShippersEXEC index_cleanup SuppliersEXEC index_cleanup TerritoriesGO/* Create Statistics */sp_createstats

    /* Show created statistics*/sp_helpstats Employees

    The created statistic has the same name as the column on which it is created. Computed columns

    and columns of the ntext, text, or image data types cannot be specified as statistics columns.

    View Index Statistics and evaluating Index Selectivity

    /* Cleanup Statistics */EXEC index_cleanup member

    /* Create UNIQUE index */

  • 8/11/2019 SQL Server 2000 Survival Guide

    36/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 36/49

    CREATE UNIQUE INDEX indx_member_no ON member (member_no)GO/* View Index Statistics and evaluating Index Selectivity */DBCC SHOW_STATISTICS (member,indx_member_no)

    Rows = 10000Density = 9.9.E-5 (Very selective, due to UNIQUE index on column)All Density = 9.9.E-5

    Density: [ 0 ... 1 ], 0 = High Selectivity, 1 = Low Selectivity

    All Density: Over more columns

    Views

    Creating Views

    CREATE VIEW [Orders Qry]ASSELECT O.OrderID, O.CustomerID, O.EmployeeID, O.OrderDate, O.RequiredDate, O.ShippedDate, O.ShipVia, O.Freight, O.ShipName, O.ShipAddress, O.ShipCity, O.ShipRegion, O.ShipPostalCode, O.ShipCountry, C.CompanyName, C.Address, C.City, C.Region, C.PostalCode, C.Country FROM Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID

    CREATE VIEW MyTopCities AS SELECT DISTINCT TOP 10 PERCENT ShipCity, ShipRegion

    FROM Orders ORDER BY ShipCity

    Encrypt / Decrypt Views

    CREATE VIEW MyTopCitiesWITH ENCRYPTION ASSELECT DISTINCT TOP 10 PERCENT ShipCity, ShipRegionFROM OrdersORDER BY ShipCity

    sp_helptext MyTopCities

    The object comments have been encrypted.

    Decrypt the View with the Public Domain Stored Procedure DECRYPT2K

    EXEC dbo.DECRYPT2K MyTopCities,'V'

    Updateable Views

    CREATE VIEW FormaggiProductsViewAS SELECT ProductID, ProductName, SupplierID FROM Products WHERE SupplierID = 14

    WITH CHECK OPTION

    Indexed Views

    See here

    Stored Procedures

    System Stored Procedures, identified by the sp_ prefix

    Temporary Stored Procedures have names start with a single number sign (#)

    Extended Stored Procedures are implemented as DLLs (xp_)

    Name of SP is in sysobjects table, code in syscomments table

    -- Create Stored Procedure

    USE ClassNorthwindGO

    IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[MyOrders]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) DROP PROCEDURE [dbo].[MyOrders]

    http://www.akadia.com/services/sqlsrv_matviews.html
  • 8/11/2019 SQL Server 2000 Survival Guide

    37/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 37/49

    GO

    CREATE PROCEDURE MyOrdersAS SELECT * FROM Orders WHERE RequiredDate < GETDATE() AND ShippedDate IS NULLGO

    -- Execute Stored Procedure by ItselfEXEC MyOrdersGO

    Populate Table with a Stored Procedure

    The INSERT statemant can populate a local table with a result set that is returned from a local or

    remote stored procedure. SQL Server loads the table with data that is returned from SELECT

    statements in the stored procedure. Tha table mus exist.

    -- Excecute Stored Procedure within an INSERT StatementINSERT INTO MyTable EXEC MyOrdersGO

    -- Help on Stored Proceduressp_help MyOrderssp_helptext MyOrders

    sp_depends MyOrderssp_stored_procedures

    Check Stored Procedure Properties

    Use OBJECT_ID() and OBJECTPROPERTY()

    DECLARE @obid INTEGERSELECT @obid = OBJECT_ID('MyOrders')SELECT OBJECTPROPERTY(@obid,'ExecIsAnsiNullsOn')

    Recompile all Stored Procedures, Trigger that reference a Table

    Causes stored procedures and triggers to be recompiled the next time they are run.sp_recompile

    Using Input Parameters

    USE ClassNorthwindGO

    CREATE PROCEDURE YearSales @Start datetime, @End datetime = NULLASIF (@Start IS NULL OR @End IS NULL)BEGIN RAISERROR('NULL Values are not allowed',14,1) RETURNENDSELECT ShippedDate, OrderID FROM OrdersWHERE DATENAME (yyyy,ShippedDate) BETWEEN @Start AND @EndGO

    EXEC YearSales @Start = '1997', @End = '1998'

    Returning Values Using Output Parameters

    CREATE PROCEDURE MathTutor @m1 smallint, @m2 smallint, @result smallint OUTPUTAS SET @result = @m1 * @m2GO

  • 8/11/2019 SQL Server 2000 Survival Guide

    38/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 38/49

    DECLARE @answer smallintEXECUTE MathTutor 5,6,@answer OUTPUTSELECT 'Result = ', @answer

    Process OUTPUT Value and RETURN Parameter

    USE ClassNorthwindGO/* Create Procedure with OUTPUT Parameter */CREATE PROC dbo.OrderCount

    @CustomerID nchar (5), @OrderCount int OUTPUTASIF EXISTS (SELECT * FROM Orders WHERE CustomerID = @CustomerID AND ShippedDate IS Null) BEGIN SELECT @OrderCount=COUNT(*) FROM Orders WHERE CustomerID = @CustomerID RETURN (@@ROWCOUNT) ENDELSE RETURN (0)GO/* Process Return Value and OUTPUT Parameter */

    DECLARE@CustomerID nchar (5),@Message varchar(80),@ReturnCode int,@NumberOrders intSET @CustomerID = 'LILAS'EXEC @ReturnCode = OrderCount @CustomerID, @NumberOrders OUTPUT

    IF @ReturnCode = 1

    BEGIN SELECT @Message = 'Customer ' + RTRIM(CONVERT(char(8),@CustomerID)) + ' has ' +

    RTRIM(CONVERT(char(8),@NumberOrders)) + ' unfilled order(s).' RAISERROR (@Message, 10 ,1)ENDELSEBEGIN SELECT @Message = 'Customer ' + RTRIM(convert(char(8),@CustomerID)) + ' has NO unfilled order(s).' RAISERROR (@Message, 10 ,1)ENDGO

    Using last insert @@identity for Foreign Key ValueUSE ClassNorthwindGO

    /* If the object already exists in the database, drop it. */IF OBJECT_ID('SupplierProductInsert') IS NOT NULL DROP PROCEDURE SupplierProductInsertGO

    /* Create SP to INSERT Values in Supplier Table */CREATE PROCEDURE SupplierProductInsert @CompanyName nvarchar (40) = NULL, @ContactName nvarchar (40) = NULL, @ContactTitle nvarchar (40)= NULL,

    @Address nvarchar (60) = NULL, @City nvarchar (15) = NULL, @Region nvarchar (40) = NULL, @PostalCode nvarchar (10) = NULL, @Country nvarchar (15) = NULL, @Phone nvarchar (24) = NULL, @Fax nvarchar (24) = NULL,

  • 8/11/2019 SQL Server 2000 Survival Guide

    39/49

    2/7/2014 SQL Server 2000 Survival Guide

    http://www.akadia.com/services/sqlsrv_programming.html 39/49

    @HomePage ntext = NULL, @ProductName nvarchar (40) = NULL, @CategoryID int = NULL, @QuantityPerUnit nvarchar (20) = NULL, @UnitPrice money = NULL, @UnitsInStock smallint = NULL, @UnitsOnOrder smallint = NULL, @ReorderLevel smallint = NULL, @Discontinued bit = NULLAS IF @CompanyName IS NULL OR

    @ContactName IS NULL OR @Address IS NULL OR @City IS NULL OR @Region IS NULL OR @PostalCode IS NULL OR @Country IS NULL OR @Phone IS NULL OR @ProductName IS NULL OR @CategoryID IS NULL OR @QuantityPerUnit IS NULL OR @Discontinued IS NULL BEGIN PRINT 'You must provide Company Name, Contact Name, Address, City' PRINT 'Region, Postal Code, Country, Phone, Product Name, and Discontinued.' PRINT '