오류를 무작위로 발생시키는 일부 코드를 프로덕션에 출시했습니다. 나는 이미 질문을하는 방식을 완전히 바꾸어서 문제를 해결했다. 그러나, 그것은 내가 처음에 문제를 일으킨 것이 무엇인지 모르기 때문에 누군가가 대답을 알 수 있는지 궁금해했다. 저장 프로 시저 내부에 다음과 같은 쿼리가 있습니다. 나는 중첩 된 함수 호출과 그런 식으로 쿼리를 작성하는 것은 좋은 습관이 아니라는 코멘트를 찾고 있지 않다. 왜 그것이 일관되게 작동하지 않는지 알아 내고 싶습니다. 무작위로 쿼리의 함수는 숫자가 아닌 값을 반환하고 조인에 오류가 발생합니다. 그러나 즉시 쿼리를 다시 실행하면 정상적으로 작동합니다. 당신이 가입주의 경우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_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_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_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'값을 반환합니다. 내가 이해할 수없는 것은 왜 그것이 무작위로 다른 것을 돌려 보내는 이유입니다. –