USE AdventureWorks2012
DECLARE @AccountNumber AS VARCHAR(200)
SET @AccountNumber = 'AW00000002'
SELECT
StoreID, CustomerID, ModifiedDate, PersonID
FROM Sales.Customer
WHERE AccountNumber = @AccountNumber
USE TSQL2012
DECLARE @shipcity AS VARCHAR(50)
DECLARE @sqlCommand AS VARCHAR(500)
DECLARE @columnList AS VARCHAR(200)
SET @shipcity = 'Lyon'
SET @columnList = 'orderid, custid, orderdate, shipname, shipaddress, shipcity'
SET @sqlCommand = 'SELECT '+ @columnList + ' FROM Sales.Orders WHERE shipcity = '+ @shipcity
EXEC(@sqlCommand)
居然出错了,让人始料未及,当设置参数值时我们应该将 SET @shipcity = 'Lyon' 进行如下修改:
SET @shipcity = '''Lyon'''
sp_executesql动态SQL语句查询(推荐)
USE TSQL2012
DECLARE @shipcity AS VARCHAR(50)
DECLARE @sqlCommand AS VARCHAR(500)
DECLARE @columnList AS VARCHAR(200)
SET @shipcity = 'Lyon'
SET @columnList = 'orderid, custid, orderdate, shipname, shipaddress, shipcity'
SET @sqlCommand = 'SELECT '+ @columnList + ' FROM Sales.Orders WHERE shipcity = @shipcity'
EXECUTE sp_executesql @sqlCommand,
N'@shipcity VARCHAR(50)',
@shipcity = @shipcity
USE AdventureWorks2012
GO
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[Sales].[GetSalesOrders]')
AND type in (N'P', N'PC'))
DROP PROCEDURE [Sales].[GetSalesOrders]
GO
CREATE PROCEDURE [Sales].[GetSalesOrders] (
@CustomerID INT = NULL,
@CreditCardID INT = NULL)
AS
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(4000);
DECLARE @ParameterDefinition NVARCHAR(4000);
SELECT @ParameterDefinition = '
@CustomerParameter INT,
@CreditCardIDParameter INT
';
SELECT @SQL = N'
SELECT [SalesOrderID], [OrderDate], [Status],
[CustomerID], [CreditCardID]
FROM [Sales].[SalesOrderHeader]
WHERE 1 = 1
';
IF @CustomerID IS NOT NULL
SELECT @SQL = @SQL + N'
AND CustomerID = @CustomerParameter ';
IF @CreditCardID IS NOT NULL
SELECT @SQL = @SQL + N'
AND CreditCardID = @CreditCardIDParameter ';
EXECUTE sp_executesql
@SQL,
@ParameterDefinition,
@CustomerParameter = @CustomerID,
@CreditCardIDParameter = @CreditCardID;
GO
SET NOCOUNT OFF;
再复杂也不过就是多表查询和多条件筛选罢了,还是比较简单。得出如下结果。
USE AdventureWorks2012
GO
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[Sales].[GetSalesOrders]')
AND type in (N'P', N'PC'))
DROP PROCEDURE [Sales].[GetSalesOrders]
GO
CREATE PROCEDURE [Sales].[GetSalesOrders] (
@CustomerID INT = NULL,
@CreditCardID INT = NULL,
@debug bit = 0)
AS
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(4000);
DECLARE @ParameterDefinition NVARCHAR(4000);
SELECT @ParameterDefinition = '
@CustomerParameter INT,
@CreditCardIDParameter INT
';
SELECT @SQL = N'
SELECT [SalesOrderID], [OrderDate], [Status],
[CustomerID], [CreditCardID]
FROM [Sales].[SalesOrderHeader]
WHERE 1 = 1
';
IF @CustomerID IS NOT NULL
SELECT @SQL = @SQL + N'
AND CustomerID = @CustomerParameter ';
IF @CreditCardID IS NOT NULL
SELECT @SQL = @SQL + N'
AND CreditCardID = @CreditCardIDParameter ';
IF @debug = 1
PRINT @SQL
EXECUTE sp_executesql
@SQL,
@ParameterDefinition,
@CustomerParameter = @CustomerID,
@CreditCardIDParameter = @CreditCardID;
GO
EXEC [Sales].[GetSalesOrders] @debug = 1, @CustomerID = 29565
SET NOCOUNT OFF;
此时我们调试发现SQL语句没有写错并且生成的结果如下: