T-sql 根据参数动态更改另一个函数内的函数名称
T-sql dynamically change function name that is within another function based on a paramater
是否可以根据参数更改在另一个函数中调用的函数的名称?在此文本下,我有一个子函数示例(对于特定语言(英语、德语等),根据金额将次要货币转换为单词,例如,如果金额为 1 欧元,则它将转换为“欧元”,如果它是 2 欧元,那么它会将其转换为“欧元”。
/* HELP
@number - number we use to determine whether we need to convert to singular/plural currency word
@val - currency we need to convert
@valsMap - table for currencies and their singular/plural name (id_val = currency for conversion, val_name = singular/plural word for the currency)
@str - result of minor currency unit we've converted
*/
CREATE FUNCTION [dbo].[test_secondPartInternal_ENG] (@number int, @val varchar(5))
RETURNS VARCHAR(MAX) AS
BEGIN
--declare currency table
DECLARE @valsMap TABLE (id_val NVARCHAR(5), val_name NVARCHAR(50))
--declare string and set it's default value for conversion
DECLARE @str NVARCHAR(MAX) = ''
--insert currency and currency name
INSERT INTO @valsMap (id_val, val_name) VALUES ('EUR', IIF(@number = 1, 'cent', 'cents')), ('CHF', IIF(@number = 1, 'centime', 'centimes'))
--set for currency
SET @str = @str + (SELECT val_name FROM @valsMap WHERE id_val = @val)
--result of conversion
RETURN LTRIM(RTRIM(@str))
END
这里我有一个父函数,它根据我们给定的参数调用上面的子函数(上面的函数存在于多种语言中),例如,如果我们将 @val 参数设置为“4”,那么它会调用上面的英语函数。
/* HELP
@number - number we need to convert
@val - currency we need to convert
@wordlang - language we need to convert to (1 HR, 2 RS, 3 SI, 4 ANG)
@fnsMap - table for currencies and their functions (lang = language for conversion (1 HR, 2 RS, 3 SI, 4 ENG), fn_name = function name for specified currency)
@str - result of minor currency unit we've converted
*/
CREATE FUNCTION [dbo].[test_secondInternal] (@number INT, @wordlang INT, @val VARCHAR(3))
RETURNS VARCHAR(MAX) AS
BEGIN
--declare currency table
DECLARE @fnsMap TABLE (lang NVARCHAR(5), fn_name NVARCHAR(3))
INSERT INTO @fnsMap (lang, fn_name) VALUES (1, 'HR'), (2, 'RS'), (3, 'SI'), (4, 'ENG')
--declare string and set it's default value for conversion
DECLARE @str NVARCHAR(MAX) = ''
--set for function
SET @str = @str + 'dbo.test_secondPartInternal_' + (SELECT fn_name FROM @fnsMap WHERE lang = @wordlang) + '(' + cast(@number as varchar(20)) + ', ''' + @val + ''')'
--result of conversion
RETURN @str
END
这是根据我们选择的语言调用前一个函数SET @str = @str + 'dbo.test_secondPartInternal_' + (SELECT fn_name FROM @fnsMap WHERE lang = @wordlang)
的部分,第二个函数的结果是一个字符串“dbo.test_secondPartInternal_ENG(12, 'EUR')”,我无法在同一个函数中将其转换为“euros”,这将是第一个函数转换的结果。所以我想知道是否可以根据我们选择的语言将函数“test_secondPartInternal_”的后缀更改为例如“test_secondPartInternal_ENG”,或者我只能使用“IF”语句来完成?
我没有将这两个函数组合在一起的原因是因为第一个函数存在于多种语言中,所以如果我将它们全部放在一个函数中,代码会太长,而它们请注意,单独添加或修复每个功能要快得多。我试图实现的是在父函数中模板化子函数的调用,但这似乎是不可能的。但与我的同事一起,我们找到了解决方法。在插入部分代码中,我放置了每个函数的全名,而不是函数的后缀,这样它就可以工作了。
而不是 INSERT INTO @fnsMap (lang, fn_name) VALUES (1, 'HR'), (2, 'RS'), (3, 'SI'), (4, 'ENG')
和 SET @str = @str + 'dbo.test_secondPartInternal_' + (SELECT fn_name FROM @fnsMap WHERE lang = @wordlang)
我放了以下 (1, dbo.test_secondPartInternal_HR(@number,@val)), (2, dbo.test_secondPartInternal_RS)), (3, dbo.test_secondPartInternal_SI)), (4, dbo.test_secondPartInternal_ENG))
和 SET @str = @str + (SELECT fn_name FROM @fnsMap WHERE lang = @wordlang)
最终父函数如下所示
CREATE FUNCTION [dbo].[test_secondInternal] (@number INT, @wordlang INT, @val VARCHAR(3))
RETURNS VARCHAR(MAX) AS
BEGIN
--declare currency table
DECLARE @fnsMap TABLE (lang NVARCHAR(5), fn_name VARCHAR(50))
INSERT INTO @fnsMap (lang, fn_name) VALUES (1, dbo.test_secondPartInternal_HR(@number,@val)), (2, dbo.test_secondPartInternal_RS(@number,@val)), (3, dbo.test_secondPartInternal_SI(@number,@val)), (4, dbo.test_secondPartInternal_ENG(@number,@val))
--declare string and set it's default value for conversion
DECLARE @str VARCHAR(MAX) = ''
--set for function
SET @str = @str + (SELECT fn_name FROM @fnsMap WHERE lang = @wordlang)
RETURN @str
END
编辑:修复了一些拼写错误和小错误
是否可以根据参数更改在另一个函数中调用的函数的名称?在此文本下,我有一个子函数示例(对于特定语言(英语、德语等),根据金额将次要货币转换为单词,例如,如果金额为 1 欧元,则它将转换为“欧元”,如果它是 2 欧元,那么它会将其转换为“欧元”。
/* HELP
@number - number we use to determine whether we need to convert to singular/plural currency word
@val - currency we need to convert
@valsMap - table for currencies and their singular/plural name (id_val = currency for conversion, val_name = singular/plural word for the currency)
@str - result of minor currency unit we've converted
*/
CREATE FUNCTION [dbo].[test_secondPartInternal_ENG] (@number int, @val varchar(5))
RETURNS VARCHAR(MAX) AS
BEGIN
--declare currency table
DECLARE @valsMap TABLE (id_val NVARCHAR(5), val_name NVARCHAR(50))
--declare string and set it's default value for conversion
DECLARE @str NVARCHAR(MAX) = ''
--insert currency and currency name
INSERT INTO @valsMap (id_val, val_name) VALUES ('EUR', IIF(@number = 1, 'cent', 'cents')), ('CHF', IIF(@number = 1, 'centime', 'centimes'))
--set for currency
SET @str = @str + (SELECT val_name FROM @valsMap WHERE id_val = @val)
--result of conversion
RETURN LTRIM(RTRIM(@str))
END
这里我有一个父函数,它根据我们给定的参数调用上面的子函数(上面的函数存在于多种语言中),例如,如果我们将 @val 参数设置为“4”,那么它会调用上面的英语函数。
/* HELP
@number - number we need to convert
@val - currency we need to convert
@wordlang - language we need to convert to (1 HR, 2 RS, 3 SI, 4 ANG)
@fnsMap - table for currencies and their functions (lang = language for conversion (1 HR, 2 RS, 3 SI, 4 ENG), fn_name = function name for specified currency)
@str - result of minor currency unit we've converted
*/
CREATE FUNCTION [dbo].[test_secondInternal] (@number INT, @wordlang INT, @val VARCHAR(3))
RETURNS VARCHAR(MAX) AS
BEGIN
--declare currency table
DECLARE @fnsMap TABLE (lang NVARCHAR(5), fn_name NVARCHAR(3))
INSERT INTO @fnsMap (lang, fn_name) VALUES (1, 'HR'), (2, 'RS'), (3, 'SI'), (4, 'ENG')
--declare string and set it's default value for conversion
DECLARE @str NVARCHAR(MAX) = ''
--set for function
SET @str = @str + 'dbo.test_secondPartInternal_' + (SELECT fn_name FROM @fnsMap WHERE lang = @wordlang) + '(' + cast(@number as varchar(20)) + ', ''' + @val + ''')'
--result of conversion
RETURN @str
END
这是根据我们选择的语言调用前一个函数SET @str = @str + 'dbo.test_secondPartInternal_' + (SELECT fn_name FROM @fnsMap WHERE lang = @wordlang)
的部分,第二个函数的结果是一个字符串“dbo.test_secondPartInternal_ENG(12, 'EUR')”,我无法在同一个函数中将其转换为“euros”,这将是第一个函数转换的结果。所以我想知道是否可以根据我们选择的语言将函数“test_secondPartInternal_”的后缀更改为例如“test_secondPartInternal_ENG”,或者我只能使用“IF”语句来完成?
我没有将这两个函数组合在一起的原因是因为第一个函数存在于多种语言中,所以如果我将它们全部放在一个函数中,代码会太长,而它们请注意,单独添加或修复每个功能要快得多。我试图实现的是在父函数中模板化子函数的调用,但这似乎是不可能的。但与我的同事一起,我们找到了解决方法。在插入部分代码中,我放置了每个函数的全名,而不是函数的后缀,这样它就可以工作了。
而不是 INSERT INTO @fnsMap (lang, fn_name) VALUES (1, 'HR'), (2, 'RS'), (3, 'SI'), (4, 'ENG')
和 SET @str = @str + 'dbo.test_secondPartInternal_' + (SELECT fn_name FROM @fnsMap WHERE lang = @wordlang)
我放了以下 (1, dbo.test_secondPartInternal_HR(@number,@val)), (2, dbo.test_secondPartInternal_RS)), (3, dbo.test_secondPartInternal_SI)), (4, dbo.test_secondPartInternal_ENG))
和 SET @str = @str + (SELECT fn_name FROM @fnsMap WHERE lang = @wordlang)
最终父函数如下所示
CREATE FUNCTION [dbo].[test_secondInternal] (@number INT, @wordlang INT, @val VARCHAR(3))
RETURNS VARCHAR(MAX) AS
BEGIN
--declare currency table
DECLARE @fnsMap TABLE (lang NVARCHAR(5), fn_name VARCHAR(50))
INSERT INTO @fnsMap (lang, fn_name) VALUES (1, dbo.test_secondPartInternal_HR(@number,@val)), (2, dbo.test_secondPartInternal_RS(@number,@val)), (3, dbo.test_secondPartInternal_SI(@number,@val)), (4, dbo.test_secondPartInternal_ENG(@number,@val))
--declare string and set it's default value for conversion
DECLARE @str VARCHAR(MAX) = ''
--set for function
SET @str = @str + (SELECT fn_name FROM @fnsMap WHERE lang = @wordlang)
RETURN @str
END
编辑:修复了一些拼写错误和小错误