2011-08-11 35 views
0

我有一個表T與2列C1和C2如何在T-SQL函數中爲所有列名添加前綴?

我想要一個函數,返回T後,但所有列名前加「PREFIX_」。

前綴是傳遞給函數的動態字符串。

有可能嗎?

我想是這樣

SELECT C1 AS @prefix + 'C1', 
    C2 AS @prefix + 'C2' 
FROM T 
+0

想要寫入的函數總是在同一張表上運行,還是要指定任意表? – Tao

+0

@Tao同表總是 – Rohit

+0

我已經要求對您的問題進行編輯,以澄清您要更改列名稱,而不是值。正如@Alex K.在下面指出的那樣,某種形式的Dynamic SQL是返回結果集的唯一方式,它具有不同的/未知的模式。您不能使用函數,但可以將動態SQL包裝在存儲過程中。 – Tao

回答

0

由於其已知的列數,你可以構建與別名和exec()它的SQL字符串;

declare @prefix varchar(32) = 'prefix_' 
declare @sql nvarchar(1024) 

set @sql = 'select C1 as [' + @prefix + 'C1], C2 as [' + @prefix + 'C2] from T' 
exec(@sql) 
+0

我可以使用exec返回表嗎? – Rohit

+0

'exec'在函數中不可用 –

1

即使您不知道已經存在的列,也可以這樣做。

declare @prefix varchar(20) 
declare @sqltext nvarchar(500) 
set @prefix = 'prefix_' 

declare @columnnames varchar(500) 

select @columnnames = coalesce(@columnnames, '')+',' +column_name + ' '+ @prefix+column_name 
from INFORMATION_SCHEMA.COLUMNS a where table_name = 't' and table_schema = 'dbo' 

set @sqltext = 'select '+stuff(@columnnames,1,1,char(0))+' from t' 

exec(@sqltext) 
+0

我可以創建一個函數來返回上述結果嗎? – Rohit

+0

不,但您可以創建一個存儲過程並將結果重定向到一個表中。我沒有看到使用此功能的優點。 –

+0

@Rohit它只能用動態sql解決你的問題。動態SQL不會在函數中工作,您將不得不使用存儲過程。 –

相關問題