CREATE FUNCTION [dbo].[GetMaxLevel]()
RETURNS INT
AS
BEGIN
DECLARE @maxLevel INT;
SET @maxLevel = 1;
DECLARE @level INT ;
DECLARE @parentidVal NVARCHAR(50);
DECLARE @natureid NVARCHAR(50);
DECLARE @naturenm NVARCHAR(50);
DECLARE @parentid NVARCHAR(50);
DECLARE myCursor CURSOR FOR SELECT natureid FROM dbo.CRNATUREM0;
OPEN myCursor
FETCH NEXT FROM myCursor INTO @natureid
WHILE @@FETCH_STATUS = 0
BEGIN
SET @level = 1;
SET @parentidVal = (SELECT parentid FROM dbo.CRNATUREM0 WHERE natureid = @natureid) ;
IF EXISTS(SELECT COUNT(*) FROM dbo.CRNATUREM0 WHERE parentid = @natureid)
BEGIN
WHILE(LEN(@parentidVal) > 0)
BEGIN
SET @level = @level + 1;
SET @parentidVal = (SELECT parentid FROM dbo.CRNATUREM0 WHERE natureid = @parentidVal) ;
END
END
IF( @maxLevel < @level)
BEGIN
SET @maxLevel = @level;
END
FETCH NEXT FROM myCursor INTO @natureid
END
CLOSE myCursor
DEALLOCATE myCursor
RETURN @maxLevel
END
GO
CREATE FUNCTION [dbo].[GetLevelByNatureID](
@natureid nvarchar(20)
)
RETURNS INT
AS
BEGIN
DECLARE @maxLevel INT;
SET @maxLevel = 1;
DECLARE @level INT ;
DECLARE @parentidVal NVARCHAR(50);
SET @level = 1;
SET @parentidVal = (SELECT parentid FROM CRNATUREM0 WHERE natureid = @natureid) ;
IF EXISTS(SELECT COUNT(*) FROM dbo.CRNATUREM0 WHERE parentid = @natureid)
BEGIN
WHILE(LEN(@parentidVal) > 0)
BEGIN
SET @level = @level + 1;
SET @parentidVal = (SELECT parentid FROM dbo.CRNATUREM0 WHERE natureid = @parentidVal) ;
END
END
IF( @maxLevel < @level)
BEGIN
SET @maxLevel = @level;
END
RETURN @maxLevel
END
GO
-- =============================================
-- Author: JIM
-- Create date: 依据Natureid 获得Nature 明细信息
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[GetNatureValsByID]
-- Add the parameters for the stored procedure here
@natureid nvarchar(20),
@level INT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @index INT;
DECLARE @parentidVal NVARCHAR(20)
-- Insert statements for procedure here
IF EXISTS ( SELECT * FROM sysobjects WHERE id = OBJECT_ID('tempdb..#natureVal') AND type = 'U' )
DROP TABLE #natureVal;
CREATE TABLE #natureVal
(
natureKey int ,
natureVal nvarchar(100)
)
SET @index = (SELECT COUNT(*) FROM dbo.CRNATUREM0 WHERE natureid = @natureid)
SET @level = 0;
WHILE @index > 0
BEGIN
-- 保存Nature数据
INSERT #natureVal( natureKey, natureVal )
SELECT @level, naturenm FROM dbo.CRNATUREM0 WHERE natureid = @natureid
SET @parentidVal = (SELECT parentid FROM dbo.CRNATUREM0 WHERE natureid = @natureid);
SET @natureid = @parentidVal;
IF(LEN(@parentidVal) > 0)
BEGIN
SET @index = (SELECT COUNT(*) FROM dbo.CRNATUREM0 WHERE natureid = @parentidVal);
SET @level = @level + 1;
END
ELSE
BEGIN
SET @index = 0;
END
END
SELECT natureKey, natureVal FROM #natureVal
END
GO
CREATE PROCEDURE [dbo].[GetNatureDataRow]
AS
BEGIN
-- =============================================
-- Script Template
-- =============================================
--DROP TABLE NatureDT ;
IF object_id('tempdb..#NatureDT') IS NOT NULL
BEGIN
DROP TABLE #NatureDT
END
CREATE TABLE #NatureDT
(
natureid NVARCHAR(20) ,
naturenm NVARCHAR(100)
)
DECLARE @maxLevel INT; -- Nature 最大级别数
DECLARE @level INT; -- 当前级别变量
DECLARE @colName NVARCHAR(20);
DECLARE @sTable NVARCHAR(200);
SET @level = 1;
SET @maxLevel = dbo.GetMaxLevel();
WHILE @level <= @maxLevel
BEGIN
SET @colName = 'nature' + CAST(@level AS CHAR(10));
EXEC('ALTER TABLE NatureDT ADD '+@colName+'NVARCHAR(100)');
SET @sTable = 'ALTER TABLE #NatureDT ADD '+@colName+'NVARCHAR(100) ;'
--EXEC('ALTER TABLE NatureDT ADD '+@colName+'NVARCHAR(100)');
EXEC(@sTable);
SET @level = @level + 1;
END
--- 查询创建的表
--SELECT *
--FROM NatureDT;
---/////////////////////////////////////////////////
DECLARE @natureidS NVARCHAR(20);
DECLARE @natureidSS NVARCHAR(20);
DECLARE @naturenmS NVARCHAR(100);
DECLARE @indexS INT;
DECLARE @levelS INT;
DECLARE @colnameS NVARCHAR(20);
DECLARE @parentidVal NVARCHAR(20);
DECLARE @sUpdate NVARCHAR(200);
DECLARE nCursor CURSOR
FOR
SELECT natureid
FROM dbo.CRNATUREM0
OPEN nCursor
FETCH NEXT FROM nCursor INTO @natureidS
WHILE @@FETCH_STATUS = 0
BEGIN
SET @indexS = ( SELECT COUNT(*)
FROM dbo.CRNATUREM0
WHERE natureid = @natureidS
)
SET @levelS = dbo.GetLevelByNatureID(@natureidS);
SET @colnameS = 'nature' + CAST(@levelS AS NVARCHAR(10));
IF ( @indexS > 0 )
BEGIN
SET @naturenmS = ( SELECT naturenm
FROM dbo.CRNATUREM0
WHERE natureid = @natureidS
);
INSERT #NatureDT
( natureid )
SELECT @natureidS;
SET @sUpdate = ' UPDATE #NatureDT SET ' + @colnameS
+ ' = ''' + @naturenmS + ''' WHERE natureid = '''
+ @natureidS + '''';
EXEC(@sUpdate);
END
SET @natureidSS = @natureidS;
WHILE @indexS > 0
BEGIN
-- 保存Nature数据
SET @parentidVal = ( SELECT parentid
FROM dbo.CRNATUREM0
WHERE natureid = @natureidSS
);
SET @natureidSS = @parentidVal;
IF ( LEN(@parentidVal) > 0 )
BEGIN
SET @indexS = ( SELECT COUNT(*)
FROM dbo.CRNATUREM0
WHERE natureid = @natureidSS
);
SET @levelS = @levelS - 1;
-- 保存数据
SET @colnameS = 'nature'
+ CAST(@levelS AS NVARCHAR(10));
SET @naturenmS = ( SELECT naturenm
FROM dbo.CRNATUREM0
WHERE natureid = @parentidVal
);
SET @sUpdate = ' UPDATE #NatureDT SET '
+ @colnameS + '= ''' + @naturenmS
+ ''' WHERE natureid = ''' + @natureidS
+ '''';
EXEC(@sUpdate);
END
ELSE
BEGIN
SET @indexS = 0;
END
END
FETCH NEXT FROM nCursor INTO @natureidS
END
CLOSE nCursor
DEALLOCATE nCursor
SELECT *
FROM #NatureDT
END
GO