2010-05-11 4 views
0

자신이 'n'시간에 대해 테이블을 교차 결합하기 위해/proc/select/somethingElse라는 일반 함수를 작성할 수 있습니까? (예, 'n'은 주어진 매개 변수입니다.)교차 결합 'n'테이블에

어떻게 하시겠습니까?


이 테이블 갖는

Value 
------- 
    1 
    2 
    3 

크로스가 2 회에 가입을 반환 :

Value | Value 
------------------ 
    1  1 
    1  2 
    1  3 
    2  1 
    2  2 
    2  3 
    3  1 
    3  2 
    3  3 
+1

이것은 의도하거나 적절한 SQL 사용이 아닙니다. SQL 데이터베이스는 엄격한 스키마로 행 지향적이며 명확한 스키마가 없습니다. 이러한 작업은 열이 아니라 행에 대해 수행해야합니다. 동적 SQL을 사용하여이 작업을 수행 할 수 있지만 적절한 디자인을 대신 사용하는 것이 좋습니다. – Aaronaught

+0

@AaronNaught 당신의 설명에 감사드립니다. Aaron :) +1 – SDReyes

+0

@AaronNaught 저는 생각했습니다 : crossjoin 결과가 :(combinationId, value)와 같은 정규화 된 구조로 반환 된 경우 어떻게할까요? 어떻게 생각해? – SDReyes

답변

5

:

DECLARE @upperLimit INT 
    SET @upperLimit = 1 

DECLARE @SQL NVARCHAR(MAX) 
    SET @SQL = 'SELECT * FROM '+ @table_name +' ' 

BEGIN 

    WHILE (upperLimit <= @numCrossJoins) 
    BEGIN 

    SET @SQL = @SQL + 'CROSS JOIN '+ QUOTENAME(@table_name) +' ' 

    SET @upperLimit = @upperLimit + 1 
    END 

    EXEC sp_executesql @SQL 

END 
+1

이것은 SQL Server 2000과 호환됩니다. – Tomalak

+0

@table_name을 QUOTENAME (@ 테이블 이름)으로 변경하십시오. 매개 변수 값에서 생성 된 sp_executing sql은 문제를 묻는 것입니다. –

3

당신은 많은 출력 동적 SQL을 생성 할 수 있습니다 십자가 조인 :

동적 SQL, SQL 서버 2005 + (@table_name 및 @numCrossJoins이 저장 프로 시저 매개 변수)를 사용
create table #t (value int) 

insert into #t values (1) 
insert into #t values (2) 
insert into #t values (3) 

declare @n int 
set @n = 4 

declare @sql varchar(max) 
set @sql = 'SELECT * FROM #t t' 
declare @i int 
set @i = 0 
while (@i <= @n) 
begin 
    set @sql = @sql + ' cross join #t t' + CAST(@i as varchar) 
    set @i = @i + 1 
end 

print @sql 
execute(@sql) 

drop table #t 
2

이 시도 :

SET @SQL = 'SELECT * FROM ' + replicate('[' + @table_name + '],', @N); 

set @SQL = LEFT(LEN(@SQL) - 1); 

EXEC sp_executesql @SQL;