2011-05-11 2 views
0

Это моя функция, которая в основном объединяет все данные строк в одну строку. Я знаю, что функция Coallasce доступна, но только из любопытства я хочу знать, как я могу изменить эту функцию, чтобы динамически принимать имена таблиц. В настоящее время он читается только из таблицы Employee.Как я могу заставить этот запрос принимать динамические имена таблиц?

ALTER FUNCTION [dbo].[ConcatStrig] 
(
    @TableName varchar(64), 
    @FieldName varchar(64) 
) 
RETURNS varchar(max) 
AS 
BEGIN 
    Declare @Sql as varchar(max) = '' 
    Set @Sql = 'Select ' + @FieldName + ' from ' + @TableName 

    Declare curTemp Cursor For 
     Select EmpName from sp_executesql(@Sql) 
    Declare @StrTemp as varchar(max) 
    Declare @String as varchar(max) = '' 
    Open curTemp 

    Fetch Next from curTemp into @StrTemp 

    While @@Fetch_Status = 0 
    Begin 
     Set @String = @String + ' ' + @StrTemp 

     Fetch Next from curTemp into @StrTemp 
    End 
    Close curTemp 
    Deallocate  curTemp 
    Return @String 
END 

Заранее спасибо :)

ответ

2

Вам нужно будет использовать dynamic SQL.

Это единственный способ параметризовать имена таблиц.

1

Это не совсем то, что вы ищете, но это может указывать на правильное направление. Это использует динамический sql и аккуратный трюк для конкатенации в For XML Path ('').

declare @SQL nvarchar(max), @TableName nvarchar(max) 
set @TableName='dbo.vwAsset' 
set @SQL=(select 'cast(isnull('+name+','''') as nvarchar)+'' ''+' 
from sys.columns where object_id=object_id(@TableName) 
for XML Path('') 
) 

set @SQL=LEFT(@SQL,LEN(@SQL)-1) 

set @SQL='select '[email protected]+' from '[email protected] 

exec sp_ExecuteSQL @SQL,N'' 

Надеюсь, это поможет!

Смежные вопросы