2016-12-09 1 views
1

우리는 사용자가 다양한 테이블에 고유 한 사용자 정의 열을 추가 할 수 있도록 프로젝트를 제공해야합니다.동적 (알 수없는) 열 수를 가진 T-Sql 쿼리

편집 :이 테이블은 2 개가 아니라 1 개입니다.

**Products** 
ProductId 
Name 
Price 
Date 
UserId 

**ProductsCustomColumns** 
ProductId 
ColumnName 
ColumnValue 

편집 : 동적 열 값으로 기록되어 있습니다 우리는 이들의 수를 모르는 ...이 될 수 0 또는 200 나.

다음은 예입니다. enter image description here 이제 제품 테이블을 쿼리 할 때 모든 미리 정의 된 열과 그 뒤에 모든 사용자 지정 열을 표시하려고합니다. 분명히 각 사용자는 값과 이름을 가진 자신의 개수의 열을 가질 수 있습니다.

SELECT *, (and the custom columns) FROM Products WHERE UserId = 3 AND ProductId = 1 

다음은이 개 질문들 :

  1. 그보기의 성능 관점에서 좋은 해결책이 될 것인가 또는 동적 열 요구 사항을 해결하기위한 더 좋은 방법은 무엇입니까?

  2. 나는 쿼리 열로 기록을 제공 userIdproductId에 대한 ProductsCustomColumns에서 모든 레코드를 읽고 추가 할 수있는 쿼리를 만들 수 있습니까?

감사합니다.

+0

ProductsCustomColumns는 별도의 테이블입니까? –

+0

예, 별도의 테이블. –

답변

2

당신은 동적 쿼리를 작성해야 할 동적 SQL을 다른 방법이 필요하지

DECLARE @COLUMNS VARCHAR(MAX)='', @QRY VARCHAR(MAX); 

SELECT @COLUMNS = @COLUMNS +COLUMN_NAME +',' FROM 
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Products' 

SELECT @COLUMNS =SUBSTRING (@COLUMNS,1 ,LEN(@COLUMNS)-1) 

SELECT @QRY ='SELECT '[email protected] + ' FROM Products WHERE UserId = 3 AND ProductId = 1' 
EXEC (@QRY) 

편집 : 당신의 댓글에서 & 편집 질문

스키마 I 귀하의 질문에서 가정합니다.

CREATE TABLE Products (
ProductId INT, 
Name VARCHAR(250), 
Price DECIMAL(18,2), 
DateS DATETIME, 
UserId INT) 

INSERT INTO Products 
SELECT 1,'Oil Product', 2000, GETDATE(), 3 
UNION ALL 
SELECT 2,'Amway', 600, GETDATE(), 2 
UNION ALL 
SELECT 3,'Thermal', 5000, GETDATE(), 1 
UNION ALL 
SELECT 4,'Oil Product', 500, GETDATE(), 4 



CREATE TABLE ProductsCustomColumns 
(
ProductId INT , 
ColumnName VARCHAR(200), 
ColumnValue VARCHAR(15)) 

INSERT INTO ProductsCustomColumns 
SELECT 1, 'Licence_No', '1545' 
UNION ALL 
SELECT 1, 'Location ', 'Atlanta' 
UNION ALL 
SELECT 2, 'Qty ', '5' 
UNION ALL 
SELECT 3, 'Gross', '80000' 

이제 동적 코드는 여기

DECLARE @COLUMN_PCC VARCHAR(MAX)='', @PRODUCT_ID INT=1,@USER_ID INT=3, @QRY VARCHAR(MAX) ; 

--preparing Custom Column Name List with comma ',' 
SELECT @COLUMN_PCC = @COLUMN_PCC+ [COLUMNNAME] +',' FROM ProductsCustomColumns 
WHERE ProductId= @PRODUCT_ID 
SELECT @COLUMN_PCC =SUBSTRING(@COLUMN_PCC,1,LEN(@COLUMN_PCC)-1) 


--Preparing Dynamic Query 
SELECT @QRY =' SELECT P.*, AV.* FROM Products P 
INNER JOIN 
(
SELECT * FROM (
SELECT * FROM ProductsCustomColumns WHERE ProductId= '+CAST(@PRODUCT_ID AS VARCHAR(50))+' 
) 
AS A 
PIVOT 
(
MAX (COLUMNVALUE) 
FOR [COLUMNNAME] IN ('[email protected]_PCC +') 
)AS PVT 
)AS AV ON P.ProductId= AV.ProductId 
AND P.UserId='++CAST(@USER_ID AS VARCHAR(50))+' 
' 

EXEC (@QRY) 

간다 그리고 결과는 기본 테이블의 추가 열에서 사용자 정의 데이터를 추가하는 아주 나쁜 생각입니다 일반적으로

+-----------+-------------+---------+-------------------------+--------+-----------+------------+----------+ 
| ProductId | Name  | Price |   DateS   | UserId | ProductId | Licence_No | Location | 
+-----------+-------------+---------+-------------------------+--------+-----------+------------+----------+ 
|   1 | Oil Product | 2000.00 | 2016-12-09 18:06:24.090 |  3 |   1 |  1545 | Atlanta | 
+-----------+-------------+---------+-------------------------+--------+-----------+------------+----------+ 
+0

동적 열은 다른 테이블 열에서 온 것이 아니라 두 번째 테이블의 레코드입니다. –

+0

@st_stefanov 지금 편집 된 것을 확인하십시오. –

+0

놀랍습니다. 한번 시도해보십시오! –

0

는이

DECLARE @sql  VARCHAR(max), 
     @cust_col VARCHAR(max) 

SET @cust_col = (SELECT Quotename(CustomColumns) + ',' 
       FROM ProductsCustomColumns 
       FOR xml path('')) 

SELECT @cust_col = LEFT(@cust_col, Len(@cust_col) - 1) 

SET @sql = 'SELECT *, ' + @cust_col + ' FROM Products WHERE UserId = 3 AND ProductId = 1' 

EXEC (@sql) 
+0

실행할 때 오류를 보여줍니다. 메시지 207, 수준 16, 상태 1, 줄 1 'Comment1'열 이름이 잘못되었습니다. 참고 : Comment1은 CustomColumn의 값입니다. –

1

될 것입니다. 100 명의 고객이이를 사용한다고 상상해보십시오. 그들 모두는 서로 다른 테이블 스키마를 가지고 있으며, 그들 모두를위한 업데이트 스크립트를 작성해야합니까?

구조가 미리 알려지지 않은 결과 세트를 처리해야하는 경우 목에 통증이 있습니다!

  • 유형 XML의 하나 개의 컬럼을 추가

    당신은 몇 가지 선택이있다. 이점 : 결과 집합이 수정되었습니다. 고객 특정 규칙, XML 해석 방법이 필요합니다.인라인 테이블 값 함수을 사용하여이 문제를 해결할 수 있습니다. XML을 전달하고 파생 테이블을 다시 가져옵니다. CROSS APPLY으로이 전화해서 당신이 밖으로 ...

  • 는 고객 ID와 추가 데이터가 완전히 다른이 아닌 경우 키 - 값 쌍

  • 에 새 테이블을 추가로 일부 열을 추가하려면 주요 테이블 SPARSE

+0

사실 이들은 2 개의 테이블입니다. –

+0

또한 미리 정의 된 대량의 열을 생각하고있었습니다. –

관련 문제