我刚刚发布了一些随机导致错误的代码。我已经通过完全改变查询方式来解决问题。然而,我仍然困扰我,我不知道是什么原因造成的问题,所以想知道是否有人可能知道答案。我有一个存储过程中的以下查询。我不是在寻找有关使用嵌套函数调用进行查询的好实践的评论以及诸如此类的东西:-)。只是真的想找出为什么它不一致工作。随机查询中的函数将返回一个非数字值并导致连接出错。但是,如果我立即重新运行查询,它工作正常。SQL Server 2008不一致的结果
SELECT cscsf.cloud_server_current_software_firewall_id,
dbo.fn_GetCustomerFriendlyFromRuleName(cscsf.rule_name, np.policy_name) as rule_name,
cscsf.rule_action,
cscsf.rule_direction,
cscsf.source_address,
cscsf.source_mask,
cscsf.destination_address,
cscsf.destination_mask,
cscsf.protocol,
cscsf.port_or_port_range,
cscsf.created_date_utc,
cscsf.created_by
FROM CLOUD_SERVER_CURRENT_SOFTWARE_FIREWALL cscsf
LEFT JOIN CLOUD_SERVER cs
ON cscsf.cloud_server_id = cs.cloud_server_id
LEFT JOIN CLOUD_ACCOUNT cla
ON cs.cloud_account_id = cla.cloud_account_id
LEFT JOIN CONFIGURATION co
ON cla.configuration_id = co.configuration_id
LEFT JOIN DEDICATED_ACCOUNT da
ON co.dedicated_account_id = da.dedicated_account_id
LEFT JOIN CORE_ACCOUNT ca
ON da.core_account_number = ca.core_account_id
LEFT JOIN NETWORK_POLICY np
ON np.network_policy_id = (select dbo.fn_GetIDFromRuleName(cscsf.rule_name))
WHERE cs.cloud_server_id = @cloud_server_id
AND cs.current_software_firewall_confg_guid = cscsf.config_guid
AND ca.core_account_id IS NOT NULL
ORDER BY cscsf.rule_direction, cscsf.cloud_server_current_software_firewall_id
如果您发现该加入
ON np.network_policy_id = (select dbo.fn_GetIDFromRuleName(cscsf.rule_name))
调用一个函数。
这里是一个函数:
ALTER FUNCTION [dbo].[fn_GetIDFromRuleName]
(
@rule_name varchar(100)
)
RETURNS varchar(12)
AS
BEGIN
DECLARE @value varchar(12)
SET @value = dbo.fn_SplitGetNthRow(@rule_name, '-', 2)
SET @value = dbo.fn_SplitGetNthRow(@value, '_', 2)
SET @value = dbo.fn_SplitGetNthRow(@value, '-', 1)
RETURN @value
END
,然后调用这个函数:
ALTER FUNCTION [dbo].[fn_SplitGetNthRow]
(
@sInputList varchar(MAX),
@sDelimiter varchar(10) = ',',
@sRowNumber int = 1
)
RETURNS varchar(MAX)
AS
BEGIN
DECLARE @value varchar(MAX)
SELECT @value = data_split.item
FROM
(
SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as row_num FROM dbo.fn_Split(@sInputList, @sDelimiter)
) AS data_split
WHERE
data_split.row_num = @sRowNumber
IF @value IS NULL
SET @value = ''
RETURN @value
END
这最终调用这个函数:
ALTER FUNCTION [dbo].[fn_Split] (
@sInputList VARCHAR(MAX),
@sDelimiter VARCHAR(10) = ','
) RETURNS @List TABLE (item VARCHAR(MAX))
BEGIN
DECLARE @sItem VARCHAR(MAX)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
BEGIN
SELECT @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))
IF LEN(@sItem) > 0
INSERT INTO @List SELECT @sItem
END
IF LEN(@sInputList) > 0
INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
np.network_policy_id的数据类型是什么? –
您正在处理隐式数值转换。该函数返回一个'varchar(12)'数据类型,并且你正在udf中进行字符串操作,因此你确实有可能获得非数字数据,而且你没有执行任何验证来检查返回数据是否为数字(假设那就是你想要的)。因此连接中的错误。 – Kash
np.network_policy_id是一个int。我知道我得到一个错误,因为函数返回一个varchar(12),不能转换为整数。具体来说,函数返回值'NPG'。我不明白的是为什么它随机返回不同的东西。 –