Tsql 在列上运行函数两次

Tsql 在列上运行函数两次,tsql,Tsql,假设我有一个DB。让我们将此数据库称为Utils。在Utils中,我有两个函数。好吧,假设我目前在dbMyDatabase工作。我需要计算表中的一些字段。我现在就是这样做的:我的select语句如下所示 SELECT *, column1= UTILS.dbo.Function1(ID) column2 =UTILS.dbo.Function1(Name column3 =UTILS.dbo.Function1(Address) INTO ##temp_table1 FRO

假设我有一个DB。让我们将此数据库称为Utils。在
Utils
中,我有两个函数。好吧,假设我目前在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个。所以我真的不想重复select语句两次,因为如果发生更改,那么我必须在两个地方进行更改,这很容易出错,使我的脚本很长,很难阅读以及其他问题

我的解决方案

    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\u rename
。这也给了我警告。MSDN建议不要这样做


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

您可以通过以下方式更改解决方案,轻松避免使用sp_重命名:

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')

在我看来,每当查询1发生变化时,都需要进行一些轻松的复制/粘贴工作。保持对数据库和对象名称的“强类型”远胜于100行额外的代码,这些代码似乎很容易维护。如果这必须在数据库中完成,而不是在应用层中使用一组自动生成的类(如EF或LINQ to SQL),我认为您最好使用sys模式来轻松维护。在不写出整个解决方案的情况下,您可以编写一个游标,在将sys.columns连接到sys.tables的查询上进行迭代,并生成一个字符串,您可以使用exec()获得结果。