创建数据库
-
在查询编辑器窗口中,键入以下代码,但不要执行它:
CREATE DATABASE TestData
GO -
使用指针选择词语
CREATE DATABASE
,再按 F1 。SQL Server 2005 联机丛书中的 CREATE DATABASE 主题应该打开。您可以使用此方法查找 CREATE DATABASE 以及在本教程中使用的其他语句的完整语法。 -
在查询编辑器中,按 F5 以执行语句并创建名为
TestData
的数据库。
在您创建数据库时,SQL Server 制作 model 数据库的副本,并将该副本重命名为数据库名称。除非您将初始大小很大的数据库指定为可选参数,否则此操作应该只需要几秒钟。
![]() |
---|
在单个批处理中提交多条语句时,可以用关键字 GO 分隔各语句。当批处理只包含一条语句时,GO 是可选的。 |
切换到数据库
-
在查询编辑器窗口中,键入以下代码,并执行它以更改与
TestData
数据库的连接。USE TestData
GO
创建表:
-
在查询编辑器窗口中,键入以下代码,并执行它以创建一个名为
Products
的简单表。该表中各列的名称为ProductID
、ProductName
、Price
和ProductDescription
。ProductID
列是表的主键。int
、varchar(25)
、money
和text
都是数据类型。当插入或更改行时,只有Price
和ProductionDescription
列可以不包含数据。此语句包含称为架构的可选元素 (dbo.
)。架构是拥有表的数据库对象。如果您是管理员,则dbo
是默认架构。dbo
代表数据库所有者。CREATE TABLE dbo.Products
(ProductID int PRIMARY KEY NOT NULL,
ProductName varchar(25) NOT NULL,
Price money NULL,
ProductDescription text NULL)
GO
新建日期: 2006 年 4 月 14 日
您已经创建 Products 表,可以通过使用 INSERT 语句向该表中插入数据了。插入数据后,将通过使用 UPDATE 语句更改行的内容。您将使用 UPDATE 语句的 WHERE 子句,以限制对单个行的更新。这四条语句将输入以下数据。
ProductID | ProductName | Price | ProductDescription |
---|---|---|---|
1 | Clamp | 12.48 | Workbench clamp |
50 | Screwdriver | 3.17 | Flat head |
75 | Tire Bar |
| Tool for changing tires. |
3000 | 3mm Bracket | .52 |
|
基本语法如下:INSERT、表名、列的列表、VALUES,然后是要插入的值的列表。如果某行的前面有两个连字符,则指示该行为注释,编译器将忽略其文本。在这种情况下,注释说明允许的语法变体。

-
执行以下语句,将一行插入到在上一个任务中创建的
Products
表中。基本语法如下:-- Standard syntax
INSERT dbo.Products (ProductID, ProductName, Price, ProductDescription)
VALUES (1, 'Clamp', 12.48, 'Workbench clamp')
GO
-
以下语句显示如何通过在字段列表(在圆括号中)中和值列表中均切换
ProductID
和ProductName
的位置,更改提供参数的顺序。-- Changing the order of the columns
INSERT dbo.Products (ProductName, ProductID, Price, ProductDescription)
VALUES ('Screwdriver', 50, 3.17, 'Flat head')
GO
-
以下语句演示,只要值是按正确顺序列出的,列的名称就是可选的。此语法很常见,但是建议不要使用它,因为其他人了解您的代码可能会更困难。为
Price
列指定了NULL
,因为还不知道此产品的价格。-- Skipping the column list, but keeping the values in order
INSERT dbo.Products
VALUES (75, 'Tire Bar', NULL, 'Tool for changing tires.')
GO
-
只要在默认架构中访问和更改表,架构名称就是可选的。由于
ProductDescription
列允许空值,而且没有提供值,因此可以从语句中完全删除ProductDescription
列的名称和值。-- Dropping the optional dbo and dropping the ProductDescription column
INSERT Products (ProductID, ProductName, Price)
VALUES (3000, '3mm Bracket', .52)
GO
更新product表
-
键入并执行以下
UPDATE
语句,将第二种产品的ProductName
从Screwdriver
更改为Flat Head Screwdriver
。UPDATE dbo.Products
SET ProductName = 'Flat Head Screwdriver'
WHERE ProductID = 50
GO
新建日期: 2006 年 4 月 14 日
使用 SELECT 语句可以读取表中的数据。SELECT 语句是最重要的 Transact-SQL 语句之一,其语法有许多变体。在本教程中,您将使用五个简单版本。

-
键入并执行以下语句以读取
Products
表中的数据。-- The basic syntax for reading data from a single table
SELECT ProductID, ProductName, Price, ProductDescription
FROM dbo.Products
GO
-
您可以使用星号选择表中的所有列。这通常用于即席查询中。您应该在永久代码中提供列的列表,以便语句将返回预测列,即使稍后将新列添加到表中也是如此。
-- Returns all columns in the table
-- Does not use the optional schema, dbo
SELECT * FROM Products
GO
-
可以省略不希望返回的列。列将按列出它们的顺序返回。
-- Returns only two of the columns from the table
SELECT ProductName, Price
FROM dbo.Products
GO
-
使用
WHERE
子句可以限制返回给用户的行。-- Returns only two of the records in the table
SELECT ProductID, ProductName, Price, ProductDescription
FROM dbo.Products
WHERE ProductID < 60
GO
-
您可以在返回列中的值时使用它们。以下示例对
Price
列执行数学运算。除非通过使用AS
关键字提供一个名称,否则以此方式更改的列将没有名称。-- Returns ProductName and the Price including a 7% tax
-- Provides the name CustomerPays for the calculated column
SELECT ProductName, Price * 1.07 AS CustomerPays
FROM dbo.Products
GO
新建日期: 2006 年 4 月 14 日
既然 Mary 可以访问 TestData 数据库,您可能希望创建一些数据库对象(如视图和存储过程),再将它们的访问权限授予 Mary。视图是存储的 SELECT 语句,而存储过程是以批处理方式执行的一条或多条 Transact-SQL 语句。
视图像表那样进行查询,但不接受参数。存储过程比视图更复杂。存储过程可以同时具有输入参数和输出参数,并可以包括控制代码流的语句,如 IF 和 WHILE 语句。将存储过程用于数据库中的所有重复操作,是一个良好的编程做法。
在此示例中,您将使用 CREATE VIEW 创建一个视图,该视图仅选择 Products 表中的两列。然后,您将使用 CREATE PROCEDURE 创建一个存储过程,该存储过程接受价格参数,并仅返回价格小于指定参数值的那些产品。


-
以下语句创建一个名为
pr_Names
的存储过程,接受名为@VarPrice
、数据类型为money
的输入参数。该存储过程打印与输入参数(已从money
数据类型更改为varchar(10)
字符数据类型)串联的语句Products less than
。然后,该存储过程对视图执行SELECT
语句,将输入参数作为WHERE
子句的一部分进行传递。这将返回价格小于输入参数值的所有产品。CREATE PROCEDURE pr_Names @VarPrice money
AS
BEGIN
-- The print statement returns text to the user
PRINT 'Products less than ' + CAST(@VarPrice AS varchar(10));
-- A second statement starts here
SELECT ProductName, Price FROM vw_Names
WHERE Price < @varPrice;
END
GO

新建日期: 2006 年 4 月 14 日
若要删除在本教程中创建的所有对象,您只需删除数据库即可。但是,在本主题中,您将完成下列步骤执行与教程中每项操作相反的操作。

-
在删除对象之前,请确保使用正确的数据库:
USE TestData;
GO -
使用
REVOKE
语句删除Mary
对存储过程的执行权限:REVOKE EXECUTE ON pr_Names FROM Mary;
GO
-
使用
DROP
语句删除Mary
对TestData
数据库的访问权限:DROP USER Mary;
GO
-
使用
DROP
语句删除Mary
对此 SQL Server 2005 实例的访问权限。DROP LOGIN [<computer_name>/Mary];
GO
-
使用
DROP
语句删除存储过程pr_Names
:DROP PROC pr_Names;
GO
-
使用
DROP
语句删除视图vw_Names
:DROP View vw_Names;
GO
-
使用
DELETE
语句删除Products
表中的所有行:DELETE FROM Products;
GO
-
使用
DROP
语句删除Products
表:DROP Table Products;
GO
-
正使用
TestData
数据库时,无法删除该数据库;因此,请首先将上下文切换到其他数据库,再使用DROP
语句删除TestData
数据库:USE MASTER;
GO
DROP DATABASE TestData;
GO
“编写 Transact-SQL 语句”教程到此结束。请记住,本教程只是简要概述,它并未介绍所用语句的所有选项。设计和创建有效的数据库结构以及配置对数据的安全访问,需要比本教程中的示例更复杂的数据库。
实例
在下面的实例中,我们首先尝试与主服务器建立连接。如果连接失败并引发异常,则尝试连接镜像服务器(可能已升级为新的主服务器)。请注意连接字符串中 failoverPartner 属性的用法。
import java.sql.*;
public class clientFailover {
public static void main(String[] args) {
// Create a variable for the connection string.
String connectionUrl = "jdbc:sqlserver://serverA:1433;" +
"databaseName=AdventureWorks;integratedSecurity=true;" +
"failoverPartner=serverB";
// Declare the JDBC objects.
Connection con = null;
Statement stmt = null;
try {
// Establish the connection to the principal server.
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(connectionUrl);
System.out.println("Connected to the principal server.");
// Note that if a failover of serverA occurs here, then an
// exception will be thrown and the failover partner will
// be used in the first catch block below.
// Create and execute an SQL statement that inserts some data.
stmt = con.createStatement();
// Note that the following statement assumes that the
// TestTable table has been created in the AdventureWorks
// sample database.
stmt.executeUpdate("INSERT INTO TestTable (Col2, Col3) VALUES ('a', 10)");
}
// Handle any errors that may have occurred.
catch (SQLException se) {
try {
// The connection to the principal server failed,
// try the mirror server which may now be the new
// principal server.
System.out.println("Connection to principal server failed, " +
"trying the mirror server.");
con = DriverManager.getConnection(connectionUrl);
System.out.println("Connected to the new principal server.");
stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO TestTable (Col2, Col3) VALUES ('a', 10)");
}
catch (Exception e) {
e.printStackTrace();
}
}
catch (Exception e) {
e.printStackTrace();
}
// Close the JDBC objects.
finally {
if (stmt != null) try { stmt.close(); } catch(Exception e) {}
if (con != null) try { con.close(); } catch(Exception e) {}
}
}
}
其他资源
SQL Server 2005 提供了许多内置函数,同时也允许您创建用户定义函数。本页中列出了这些内置函数的类别。有关用户定义函数的详细信息,请参阅 用户定义函数(数据库引擎) 。



SQL Server 内置函数可以是确定的或是不确定的。如果任何时候用一组特定的输入值调用内置函数,返回的结果总是相同的,则这些内置函数为确定的。如果每次调用内置函数 时,即使用的是同一组特定输入值,也总返回不同结果,则这些内置函数为不确定的。有关详细信息,请参阅 确定性函数和不确定性函数 。

使用字符串输入并返回字符串输出的函数,对输出使用输入字符串的排序规则。
使用非字符输入并返回字符串的函数,对输出使用当前数据库的默认排序规则。
使用多个字符串输入并返回字符串的函数,使用排序规则的优先顺序规则设置输出字符串的排序规则。有关详细信息,请参阅 排序规则优先级 (Transact-SQL) 。