【发布时间】:2016-01-26 16:57:38
【问题描述】:
表格:
CREATE TABLE Test_01
(
Cola VARCHAR(MAX),
Colb VARCHAR(MAX)
);
INSERT INTO Test_01 VALUES(1,'A');
CREATE TABLE Test_02
(
Cola VARCHAR(MAX),
Colb VARCHAR(MAX)
);
INSERT INTO Test_02 VALUES(2,'B');
CREATE TABLE Test_03
(
Cola VARCHAR(MAX),
Colb VARCHAR(MAX)
);
INSERT INTO Test_01 VALUES(3,'C');
查看:
CREATE VIEW View_Test AS
SELECT * FROM Test_01 UNION ALL
SELECT * FROM Test_02 UNION ALL
SELECT * FROM Test_03 UNION ALL;
记录:
SELECT * FROM dbo.View_test
Cola Colb
------------------
1 A
2 B
3 C
注意:现在我想通过将Cola 值传递给存储过程来准备一个临时视图。
示例:如果我将 Value 1 传递给存储过程,那么它应该准备一个临时视图
使用表 test_01,因为记录 1 属于表 test_01。
如果我将 Value 1,2,3 传递给存储过程,那么它应该准备一个临时视图
使用表的test_01,test_02,test_03,因为记录1,2,3 属于表test_01,test_02,test_03。
针对上述要求,我编写了以下存储过程:
存储过程:
ALTER PROCEDURE sp_Test_90
@Cola varchar(MAX)
AS
DECLARE @SQL VARCHAR(MAX)
DECLARE @Tab VARCHAR(MAX)
DECLARE @Query VARCHAR(MAX)
DECLARE Cur CURSOR FAST_FORWARD FOR
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_NAME = 'View_Test'
OPEN Cur
FETCH NEXT FROM Cur INTO @Tab
WHILE(@@FETCH_STATUS=0)
BEGIN
IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
BEGIN
DROP TABLE #Temp
END
CREATE TABLE #Temp
(
ColaValues VARCHAR(MAX)
);
SET @SQL = 'INSERT INTO #Temp(ColaValues) SELECT DISTINCT Cola FROM ['+@Tab+'] WHERE Cola IN('''+REPLACE(@Cola,',',''',''')+''')';
PRINT(@SQL);
EXECUTE(@SQL);
----------------------
/*Got Stuck HERE*/
----------------------
IF (SELECT DISTINCT colavalues FROM #Temp) IN(''''+REPLACE(@Cola,',',''',''')+'''')---IN (@Cola) -------GOT STUCK HERE
BEGIN
SET @SQL +='SELECT * FROM ['+@Tab+'] UNION ALL';
END
FETCH NEXT FROM Cur INTO @Tab
END
CLOSE Cur;
DEALLOCATE Cur;
SET @Query = 'WITH CTE
AS
(
'+@SQL+'
)
SELECT * FROM CTE';
PRINT(@Query);
EXECUTE(@Query);
GO
但是卡在 if 条件中检查给定参数中是否存在可乐值。
【问题讨论】:
-
“临时视图”的概念真的不清楚。你能告诉我们你的意思和它的目的吗?
-
旁注:
CREATE PROCEDURE:“在命名过程时避免使用 sp_ 前缀。SQL Server 使用此前缀来指定系统过程。” -
@Damien_The_Unbeliever,好的!感谢您的信息。
标签: sql sql-server stored-procedures sql-server-2008-r2