2014-01-07 82 views
0

使用參數表的名字,我想生成使用基於一個表名作爲參數T-SQL:在東西

此作品的「東西」功能的SQL代碼:

declare @sql as nvarchar(max); 

select @sql = stuff((SELECT distinct [Site] 
        FROM [ProcterGamble_analytics].[dbo].DATA_table 
        FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 0, ''); 

exec(@sql); 

和我在找像做

declare @presql as nvarchar(max), @sql as nvarchar(max), @table as nvarchar(max); 

SET @table = 'DATA_table'; 


select @presql = 'SELECT distinct [Site] 
        FROM [ProcterGamble_analytics].[dbo].' + @table 

select @sql = stuff((@presql 
        FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 0, ''); 

exec(@sql); 

回答

0

你並不真正需要的@presql部分,只需要加倍單引號,使他們得到妥善處理時,動態部分進行處理:

DECLARE @sql AS NVARCHAR(MAX) 
     ,@table AS NVARCHAR(MAX) = 'DATA_table'; 

SET @sql = 'stuff((SELECT distinct [Site] 
        FROM [ProcterGamble_analytics].[dbo].' + @table + ' 
        FOR XML PATH(''''), TYPE 
        ).value(''.'', ''NVARCHAR(MAX)'') 
         , 1, 0, '''')'; 

EXEC(@sql); 

測試動態SQL的一個好方法是使用PRINT(@sql); insted EXEC確認將執行的代碼是你想要的。

1

sql說法是困惑,什麼是一個字符串,什麼是生成字符串的代碼。我認爲這將工作:

select @sql = 'select stuff((' + @presql + ' 
        FOR XML PATH(''''), TYPE 
        ).value(''.'', ''NVARCHAR(MAX)'') 
         , 1, 0, '''')'; 

當您執行@sql時,它應該返回值。

+0

這是如何工作的?所有這些東西都必須有SELECT語句! –

+0

@CRAFTYDBA。 。 。你知道,我是從第一個查詢工作的角度進行操作的。但正如所寫,這只是部分。 –

+0

我用可以改變的參數解決了這個問題。他應該全部定下來。使用東西的唯一原因是刪除前面的分隔符。 TTYL –

1

我認爲你很容易混淆創建XML與使用分隔符連接不同的站點並使用stuff函數替換第一個分隔符。

我通常喜歡編寫可重用的代碼。我將數據庫,模式,表和列名作爲輸入。我使用SYSNAME作爲首選變量。

注意我使用了一組而不是獨特的。在這個例子中,它們是相同的。但是,group by有時可以節省您的時間。

查看處理指令命令。將動態字符串轉儲到XML文檔。真的很酷?

-- 
-- Generate a list in XML 
-- 

-- Pass variables w/input 
DECLARE @my_database SYSNAME = 'AdventureWorks2012'; 
DECLARE @my_schema SYSNAME = 'Production'; 
DECLARE @my_table SYSNAME = 'Product'; 
DECLARE @my_column SYSNAME = 'Name'; 

-- Create the dynamic SQL (xml output_) 
DECLARE @sql_stmt1 varchar(max) = ''; 
SET @sql_stmt1 += 'SELECT [' + @my_column + '] FROM [' + 
    @my_database + '].[' + @my_schema + '].[' + @my_table + '] '; 
SET @sql_stmt1 += 'GROUP BY [' + @my_column + '] '; 
SET @sql_stmt1 += 'ORDER BY [' + @my_column + '] '; 
SET @sql_stmt1 += 'FOR XML PATH (''''), ROOT('''+ @my_column + 's'')'; 

-- Cool instruction ? 
SELECT @sql_stmt1 as [processing-instruction(TSQL)] FOR XML PATH 

-- Show my data 
EXEC(@sql_stmt1); 

總之,這裏是以冒險作品爲例的輸出。只需更改您的案例的輸入。

enter image description here

只是套內你想要的分隔列表,我使用派生表d和應用STUFF()函數所產生的場X.

-- 
-- Generate a delimited list 
-- 

-- Pass variables w/input 
DECLARE @my_database SYSNAME = 'AdventureWorks2012'; 
DECLARE @my_schema SYSNAME = 'Production'; 
DECLARE @my_table SYSNAME = 'Product'; 
DECLARE @my_column SYSNAME = 'Name'; 

-- Create the dynamic SQL 
DECLARE @sql_stmt varchar(max) = ''; 
SET @sql_stmt += 'SELECT STUFF(X, 1, 1, '''') AS LIST FROM '; 
SET @sql_stmt += '(SELECT '','' + [' + @my_column + 
    '] FROM [' + @my_database + '].[' + @my_schema + '].[' + @my_table + '] '; 
SET @sql_stmt += 'GROUP BY [' + @my_column + '] '; 
SET @sql_stmt += 'ORDER BY [' + @my_column + '] '; 
SET @sql_stmt += 'FOR XML PATH ('''')) AS DT (X) '; 

-- Cool instruction ? 
SELECT @sql_stmt as [processing-instruction(TSQL)] FOR XML PATH 

-- Show my data 
EXEC(@sql_stmt); 

enter image description here

重複碼

我希望這回答你的問題,如果沒有,請回信。