2013-12-22 3 views
0

기존 테이블에서 TVP를 생성 할 수 있습니까? 나는 이것을 시도했는데, https://dba.stackexchange.com/questions/12596/using-tables-as-table-valued-parameters-tvp하지만 문법 오류가 나옵니까?기존 테이블에서 TVP를 동적으로 생성 하시겠습니까?

-- you would pass these two in as parameters of course: 
DECLARE 
    @TableName SYSNAME = N'LocationTable', 
    @TypeName SYSNAME = N'LocationTypeTable'; 

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql = @sql + N',' + CHAR(13) + CHAR(10) + CHAR(9) 
    + QUOTENAME(c.name) + ' ' 
    + s.name + CASE WHEN LOWER(s.name) LIKE '%char' THEN 
     '(' + CONVERT(VARCHAR(12), (c.max_length/ 
     (CASE LOWER(LEFT(s.name, 1)) WHEN N'n' THEN 2 ELSE 1 END)) + ')' 
     ELSE '' END 
     -- need much more conditionals here for other data types 
    FROM sys.columns AS c 
    INNER JOIN sys.types AS s 
    ON c.system_type_id = s.system_type_id 
    AND c.user_type_id = s.user_type_id 
    WHERE c.[object_id] = OBJECT_ID(@TableName); 

SELECT @sql = N'CREATE TYPE ' + @TypeName 
    + ' AS TABLE ' + CHAR(13) + CHAR(10) + (' + STUFF(@sql, 1, 1, '') 
    + CHAR(13) + CHAR(10) + ');'; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 

답변

0

위의 코드를 수정했습니다. 이 코드는 실행되지만 값을 반환하지 않습니다. 너 정확히 무엇을 찾고 있니?

-- you would pass these two in as parameters of course: 
DECLARE 
    @TableName SYSNAME 
    Set @TableName = N'LocationTable' 
DECLARE 
    @TypeName SYSNAME 
    Set @TypeName = N'LocationTypeTable' 

DECLARE @sql NVARCHAR(4000) 
SET @sql= N''; 

SELECT @sql = N',' + CHAR(13) + CHAR(10) + CHAR(9) 
    + QUOTENAME(c.name) + ' ' 
    + s.name + CASE WHEN LOWER(s.name) LIKE '%char' THEN 
     -- '(' + 
     CONVERT(VARCHAR(12), (c.max_length/ 
     (CASE LOWER(LEFT(s.name, 1)) WHEN N'n' THEN 2 ELSE 1 END))) 
     -- + ')' 
     ELSE '' END 
     -- need much more conditionals here for other data types 
    FROM sys.columns AS c 
    INNER JOIN sys.types AS s 
    ON c.system_type_id = s.system_type_id 
    AND c.user_type_id = s.user_type_id 
    WHERE c.[object_id] = OBJECT_ID(@TableName); 



SELECT @sql = N'CREATE TYPE ' + @TypeName 
    + ' AS TABLE ' + CHAR(13) + CHAR(10) + '(' + STUFF(@sql, 1, 1, '') 
    + CHAR(13) + CHAR(10) + ');'; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 
+0

나는 당신의 링크에서 그들이 모험을하고 있다는 것을 깨달았습니다. 나는 그것을 설치하지 않았다. 이 코드를 adventureworks 데이터베이스에 대해 실행하십시오. 또한 내가 만든 변경 사항은 작은 따옴표 누락과 set을 사용하여 변수에 값을 할당하는 것과 같은 것들입니다. – Joe

+0

질문을 신중하게 읽으십시오. 기존 테이블에서 TVP의 신택스를 가져와야합니다. – user960567

+0

위 코드에서 오류가 발생했습니다. 나는 당신을 위해 코드를 수정했다. 검색하려는 테이블의 매개 변수 이름을 지정하지 않았습니다. 미안, 너의 마음을 읽을 수가 없어. – Joe

관련 문제