SQLServer / SSIS - 使用动态表名选择JOIN

时间:2014-06-02 17:30:26

标签: sql sql-server sql-server-2008

我需要动态选择从连接中更改表,并且表(DataGenerated)是基于UserId的最后一个数字。

示例:如果UserId以2结尾,我将查看DataGenerated_2。如果UserId以3结尾,我将查看DataGenerated_3。如果它以0结尾,我将查看DataGenerated。

我试图制作一个select子句但是我被卡住了,而且在sql执行期间我找不到如何更改表名。

我的SQL仅适用于以0结尾的UserId。

SELECT e.UserId, COUNT(e.UserId) FROM Campaign c 
LEFT JOIN DataGenerated e ON c.UserId = e.UserId
WHERE e.Status = 2 and c.ExportDate IS NULL
GROUP BY e.UserId;

如果我进行了10次查询(因为表格为0到_9)并且使用了union all,我可以做我想做的事情,但我试图找到更好的方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

它可以使用Cursor:         CREATE TABLE #TEST(     UserID int)

INSERT INTO #TEST
VALUES
(0),
(1),
(2)

CREATE TABLE #DataGenerated_1(
a int)

CREATE TABLE #DataGenerated_2(
b int)

CREATE TABLE #DataGenerated(
c int)

DECLARE @User int,@Query nvarchar(50)

DECLARE C_Table CURSOR
FOR
SELECT UserID FROM #TEST
OPEN C_Table

FETCH NEXT FROM C_Table INTO @User
While (@@Fetch_status = 0)
BEGIN

IF @User <> 0
BEGIN
SET @Query = 'SELECT * FROM #DataGenerated_'+CONVERT(nvarchar(1),@User)
END

ELSE
BEGIN
SET @Query = 'SELECT * FROM #DataGenerated'
END

EXEC (@Query)

FETCH NEXT FROM C_Table INTO @User
END

CLOSE C_Table
DEALLOCATE C_Table

DROP TABLE #TEST
DROP TABLE #DataGenerated
DROP TABLE #DataGenerated_1
DROP TABLE #DataGenerated_2

希望这是你想要的 祝你有愉快的一天

艾蒂安