(3)、 create view viTest as select * from openrowset('SQLOLEDB','NIpsan' ; 'sa' ; '','exec Corsstab ')>>>>把'NIpsan'改成你的SQL Server的名字。CSDN真是可惡!要換個ID才可發言!!!
to 狼兄: 不行的,SQL2K的UDF里不支持Exec,所以這問題不能用UDF.
给一个样板,内容由你自己修改正确,主要将sp改造为函数: ------------------------------------------------------ CREATE function dbo.CorssTab ( @strTabName as varchar(50) = 'Employees', --此处放表名 @strCol as varchar(50) = 'City', --表头分组依据字段 @strGroup as varchar(50) = 'TitleOfCourtesy',--分组字段 @strNumber as varchar(50) = 'ReportsTo', --被统计的字段 @strSum as varchar(10) = 'Sum' ) RETURNS table AS begin --下面要你自己改了 DECLARE @strSql as varchar(1000), @strTmpCol as varchar(100) EXECUTE ('DECLARE corss_cursor CURSOR FOR SELECT DISTINCT ' + @strCol + ' from ' + @strTabName + ' for read only ') --生成游标 begin SET nocount ON SET @strsql ='select ' + @strGroup + ', ' + @strSum + '(' + @strNumber + ') AS [' + @strSum + ' of ' + @strNumber + ']' --查询的前半段 OPEN corss_cursor while (0=0) BEGIN FETCH NEXT FROM corss_cursor --遍历游标,将列头信息放入变量@strTmpCol INTO @strTmpCol if (@@fetch_status<>0) break SET @strsql = @strsql + ', ' + @strSum + '(CASE ' + @strCol + ' WHEN ''' + @strTmpCol + ''' THEN ' + @strNumber + ' ELSE Null END) AS [' + @strTmpCol + ' ' + @strCol + ']' --构造查询 END SET @strsql = @strsql + ' from ' + @strTabname + ' group by ' + @strGroup --查询结尾 EXECUTE(@strsql) --执行 IF @@error <>0 RETURN @@error --如果出错,返回错误代码 CLOSE corss_cursor DEALLOCATE corss_cursor RETURN 0 --释放游标,返回0表示成功end end -- GO -------------------------------------------------------- 调用: select * from dbo.CorssTab(实参。)
@strTabName as varchar(50) = 'Employees', --此处放表名
@strCol as varchar(50) = 'City', --表头分组依据字段
@strGroup as varchar(50) = 'TitleOfCourtesy',--分组字段
@strNumber as varchar(50) = 'ReportsTo', --被统计的字段
@strSum as varchar(10) = 'Sum' --运算方式
ASDECLARE @strSql as varchar(1000), @strTmpCol as varchar(100)
EXECUTE ('DECLARE corss_cursor CURSOR FOR SELECT DISTINCT ' + @strCol + ' from ' + @strTabName + ' for read only ') --生成游标
begin
SET nocount ON
SET @strsql ='select ' + @strGroup + ', ' + @strSum + '(' + @strNumber + ') AS [' + @strSum + ' of ' + @strNumber + ']' --查询的前半段 OPEN corss_cursor
while (0=0)
BEGIN
FETCH NEXT FROM corss_cursor --遍历游标,将列头信息放入变量@strTmpCol
INTO @strTmpCol
if (@@fetch_status<>0) break
SET @strsql = @strsql + ', ' + @strSum + '(CASE ' + @strCol + ' WHEN ''' + @strTmpCol + ''' THEN ' + @strNumber + ' ELSE Null END) AS [' + @strTmpCol + ' ' + @strCol + ']' --构造查询
END
SET @strsql = @strsql + ' from ' + @strTabname + ' group by ' + @strGroup --查询结尾 EXECUTE(@strsql) --执行
IF @@error <>0 RETURN @@error --如果出错,返回错误代码
CLOSE corss_cursor
DEALLOCATE corss_cursor RETURN 0 --释放游标,返回0表示成功end
GO
執行:
Exec sp_serveroption '你的SQLServer名字','data access','true'(2)、
你的Stored procedure必須建在Master資料庫中(記住,一定要在這里)(3)、
create view viTest as
select * from openrowset('SQLOLEDB','NIpsan' ; 'sa' ; '','exec Corsstab ')GO基本上,view就這樣建完了。 關於第二步的做法,我現在不是很確定,因我現在試的只有是建在master庫中才有效。
create view viTest as
select * from openrowset('SQLOLEDB','NIpsan' ; 'sa' ; '','exec Corsstab ')>>>>把'NIpsan'改成你的SQL Server的名字。CSDN真是可惡!要換個ID才可發言!!!
不行的,SQL2K的UDF里不支持Exec,所以這問題不能用UDF.
------------------------------------------------------
CREATE function dbo.CorssTab
(
@strTabName as varchar(50) = 'Employees', --此处放表名
@strCol as varchar(50) = 'City', --表头分组依据字段
@strGroup as varchar(50) = 'TitleOfCourtesy',--分组字段
@strNumber as varchar(50) = 'ReportsTo', --被统计的字段
@strSum as varchar(10) = 'Sum'
)
RETURNS table
AS
begin --下面要你自己改了
DECLARE @strSql as varchar(1000), @strTmpCol as varchar(100)
EXECUTE ('DECLARE corss_cursor CURSOR FOR SELECT DISTINCT ' + @strCol + ' from ' + @strTabName + ' for read only ') --生成游标
begin
SET nocount ON
SET @strsql ='select ' + @strGroup + ', ' + @strSum + '(' + @strNumber + ') AS [' + @strSum + ' of ' + @strNumber + ']' --查询的前半段 OPEN corss_cursor
while (0=0)
BEGIN
FETCH NEXT FROM corss_cursor --遍历游标,将列头信息放入变量@strTmpCol
INTO @strTmpCol
if (@@fetch_status<>0) break
SET @strsql = @strsql + ', ' + @strSum + '(CASE ' + @strCol + ' WHEN ''' + @strTmpCol + ''' THEN ' + @strNumber + ' ELSE Null END) AS [' + @strTmpCol + ' ' + @strCol + ']' --构造查询
END
SET @strsql = @strsql + ' from ' + @strTabname + ' group by ' + @strGroup --查询结尾 EXECUTE(@strsql) --执行
IF @@error <>0 RETURN @@error --如果出错,返回错误代码
CLOSE corss_cursor
DEALLOCATE corss_cursor RETURN 0 --释放游标,返回0表示成功end
end --
GO
--------------------------------------------------------
调用:
select * from dbo.CorssTab(实参。)