SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO CREATEPROCEDURE[dbo].[SimpleXTab]@XFieldvarChar(20), @XTablevarChar(20), @XWhereStringvarChar(250), @XFunctionvarChar(10), @XFunctionFieldvarChar(20), @XRowvarchar(40) AS Declare@SqlStrnvarchar(4000) Declare@tempsqlnvarchar(4000) Declare@SqlStrCurnvarchar(4000) Declare@colnvarchar(100) set@SqlStrCur= N'Select ['+@XField+'] into ##temptbl_Cursor from ['+@XTable+'] '+@XWhereString+' Group By ['+@XField+']' /**//* select @sqlstrcur */ exec sp_executesql @sqlstrcur declare xcursor CursorforSelect*from ##temptbl_Cursor open xcursor Fetchnextfrom xcursor into@Col While@@Fetch_Status=0 Begin set@Sqlstr=@Sqlstr+ ", " set@tempsql=isnull(@sqlstr,'') +isnull(@XFunction+'( Case When '+@XField+ " ='" +@Col + "'then[" + @XFunctionField + "]Else0End) As[" + @XFunction + @Col + "]" ,'') set@Sqlstr=@tempsql Fetchnextfrom xcursor into@Col End /**//* Select @Sqlstr as [mk], len(@sqlstr) as [leng] */ set@tempsql='Select '+@XRow+', '+@Sqlstr+' From '+@XTable+ @XWhereString+' Group by '+@XRow set@Sqlstr=@tempsql Close xcursor Deallocate xcursor set@tempsql= N'Drop Table ##temptbl_Cursor' exec sp_executesql @tempsql /**//* Select @Sqlstr as [mk], len(@sqlstr) as [leng] */ exec sp_executesql @Sqlstr GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
以NorthWind举例说明使用情况:
先建个View:
SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO CREATEVIEW dbo.vw_SampleQuery AS SELECT dbo.Orders.ShipName, dbo.Categories.CategoryName, dbo.Orders.ShipCountry, (dbo.[Order Details].UnitPrice * dbo.[Order Details].Quantity) * (1- dbo.[Order Details].Discount) AS OrderAmt FROM dbo.Orders INNERJOIN dbo.[Order Details]ON dbo.Orders.OrderID = dbo.[Order Details].OrderID INNERJOIN dbo.Products ON dbo.[Order Details].ProductID = dbo.Products.ProductID INNERJOIN dbo.Categories ON dbo.Products.CategoryID = dbo.Categories.CategoryID GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO