在列上运行两次函数

时间:2012-07-05 18:56:20

标签: tsql

假设我有一个数据库。让我们称这个数据库为Utils。在Utils我有2个功能。好吧,我想说我目前正在使用db MyDatabase。我需要计算一个表中的一些字段。这就是我目前的做法:我的select语句如下所示

SELECT *, 
   column1= UTILS.dbo.Function1(ID)
   column2 =UTILS.dbo.Function1(Name
   column3 =UTILS.dbo.Function1(Address)
INTO ##temp_table1 
FROM MyDatabase.dbo.Customers


SELECT *, 
   column1= UTILS.dbo.Function2(ID)
   column2 =UTILS.dbo.Function2(Name
   column3 =UTILS.dbo.Function2(Address)
INTO ##temp_table2
FROM MyDatabase.dbo.Customers

这个问题是我不仅要计算3列。我有大约100个。所以我真的不想重复选择语句两次,因为如果有变化,那么我必须在两个地方更改它,这很容易出错,使我的脚本很长很难阅读和其他问题。

我的解决方案

    USE Utils; GO;    
    DECLARE @strSQL VARCHAR(MAX)
    SET @strSQL = '    
        SELECT *, 
               column1= UTILS.dbo.temp_function(ID)
               column2 =UTILS.dbo.temp_function(Name
               column3 =UTILS.dbo.temp_function(Address) '

    exec sp_rename 'UTILS.dbo.Function1' ,'temp_function'
    exec (@strSQL + 'into temp_table1 FROM Customers')
    exec sp_rename 'temp_function' ,'UTILS.dbo.Function1'

    exec sp_rename 'UTILS.dbo.Function2' ,'temp_function'
    exec (@strSQL + 'into temp_table2 FROM Customers')
    exec sp_rename 'temp_function' ,'UTILS.dbo.Function2'

但我不喜欢这个解决方案,因为我必须更改数据库才能使用sp_rename。它也让我谨慎。 MSDN建议反对它。

克服这个问题的好方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以通过更改解决方案轻松避免使用sp_rename,如下所示:

USE Utils; GO;    
DECLARE @strBaseSQL VARCHAR(MAX)
       ,@strSQL VARCHAR(MAX)

SET @strBaseSQL = '    
    SELECT *, 
           column1= UTILS.dbo.temp_function(ID)
           column2 =UTILS.dbo.temp_function(Name
           column3 =UTILS.dbo.temp_function(Address) '

SELECT @strSQL = REPLACE(@strBaseSQL, 'UTILS.dbo.temp_function', 'UTILS.dbo.function1')
EXEC (@strSQL + 'into temp_table1 FROM Customers')

SELECT @strSQL = REPLACE(@strBaseSQL, 'UTILS.dbo.temp_function', 'UTILS.dbo.function2')
EXEC (@strSQL + 'into temp_table2 FROM Customers')