2013-12-22 73 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的syntex – user960567

+0

您說上面的代碼引發了錯誤。我爲你修改了代碼。您沒有提供任何表格的名稱,您嘗試檢索的參數。所以,抱歉,我無法讀懂你的想法。 – Joe