日期:2014-05-18 浏览次数:20440 次
IF object_id('tc') IS NOT NULL
DROP TABLE tc
GO
CREATE TABLE tc
(
id INT,
cont VARCHAR(100),
guid VARCHAR(20)
)
GO
INSERT tc SELECT 1, '(status = ''新增'')', 'test1'
UNION ALL SELECT 2, '(status = ''新增'') and (sid = ''1'')' ,'test1'
UNION ALL SELECT 3, '(status = ''批准'')' ,'test1'
UNION ALL SELECT 4, '(status = ''新增'') and (sid = ''2'')', 'test2'
UNION ALL SELECT 5, '(status = ''未批准'')' ,'test2'
GO
IF object_id('list') IS NOT NULL
DROP TABLE list
GO
CREATE TABLE list
(
gid INT,
status VARCHAR(20),
sid INT
)
GO
SET NOCOUNT ON
INSERT INTO list SELECT 1,'新增', 1
INSERT INTO list SELECT 2,'批准' ,2
INSERT INTO list SELECT 3,'新增' ,2
INSERT INTO list SELECT 4,'批准',1
INSERT INTO list SELECT 5,'未批准', 1
SET NOCOUNT OFF
GO
SELECT * FROM tc
GO
SELECT * FROM list
GO
IF OBJECT_ID('p_test','p') IS NOT NULL
DROP PROC p_test
GO
CREATE PROC p_test
(
@tb VARCHAR(50),
@key VARCHAR(50),
@value VARCHAR(50),
@test VARCHAR(20),
@out_condition_id INT OUTPUT
)
AS
BEGIN
IF object_id('#t_tmp') IS NOT NULL
DROP TABLE #t_tmp
DECLARE
@ext BIT,
@nid INT,
@cnt INT,
@id VARCHAR(50),
@cont VARCHAR(2000)
SELECT
@ext = 0,
@nid = 1
SELECT nid=IDENTITY(INT),id*1 id,cont
INTO #t_tmp
FROM tc
WHERE guid = @test
DECLARE @t TABLE
(
nid INT,
cnt INT
)
SELECT @cnt = @@ROWCOUNT
DECLARE @ccnt INT
WHILE @nid <=@cnt
BEGIN
DECLARE @sql NVARCHAR(2000)
SELECT @cont = cont FROM #t_tmp WHERE nid = @nid
SET @sql = N'SELECT @id=RTRIM(' + @key + ') FROM ' + @tb + ' WHERE ' + @cont + ' AND ' + @key + '=''' + @value + ''''
EXEC sp_executeSQL @sql,N'@id VARCHAR(50) OUTPUT',@id OUTPUT
IF @id IS NULL OR @id != @value
SELECT @nid = @nid + 1,@id=NULL
ELSE
BEGIN
SET @sql=N'SELECT @ccnt = COUNT(*) FROM ' + @tb + ' WHERE ' + @cont
EXEC sp_executeSQL @sql,N'@ccnt INT OUTPUT',@ccnt OUTPUT
INSERT @t SELECT id,@ccnt FROM #t_tmp WHERE nid=@nid
SET @nid=@nid+1
END
END
SELECT TOP 1