Я написал оператор SQL, который объединяет столбцы из нескольких таблиц. Я выполнил запрос, и он отлично работает. Я преобразовал SQL-запрос в хранимую процедуру, как показано ниже:
USE [databasename]
GO
/****** Object: StoredProcedure [dbo].[wufi_testing] Script Date: 18/05/2022 12:23:25 pm ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[wufi_testing]
as
select * from
openquery([Servername],'
Select vp.wufi as VP_WUFI,
assessment_number as Assess,
roll_number as Roll,
assessment_suffix as ASX,
apportionment_code as AC,
legal_description as LD,
valued_land_area,
M.system_key_2 as R1_level,
MA.status as Mat_Add_Status,
C.customer_number as Cust_Num,
C.given_names as First_Name,
C.family_name as Family_Name,
CA.print_address_1 as r1_print1,
CA.careof as care_of,
CA.floor_identification as FLOOR1,
CA.unit_identification as unit,
CA.building_name as bldg,
CA.postal_address,
CA.suburb,
CA.town,
CA.postcode,
CA.state,
CA.country,
CA.zip_code
from ((((cps.dbo.valuation_property as vp
LEFT JOIN [customer].[dbo].[matter] as M ON cps.dbo.valuation_property.wufi = M.system_key)
LEFT JOIN [customer].[dbo].[matter_address] as MA ON M.matter = MA.matter)
LEFT JOIN [customer].[dbo].[contact_address] as CA ON MA.contact_address = CA.contact_address )
LEFT JOIN [customer].[dbo].[customer] as C ON M.customer_number = C.customer_number)
where (vp.apportionment_code in (0,1,2) AND
(M.system_key_2 = 1 or M.system_key_2 is NULL) AND
vp.status = "C" AND
(M.status= "C" or M.status is NULL) AND
(M.general_description = "Ratepayer" or M.general_description is NULL or M.general_description = "Owner") AND
(MA.status = "C" or MA.status is null) AND
(CA.status="C" or CA.status is NULL) AND
(C.status="C" or C.status is NULL))
')
Когда я выполнил вышеуказанный запрос, он выдал следующие сообщения об ошибках:
Msg 8180, Level 16, State 1, Line 8
Statement(s) could not be prepared.
Msg 207, Level 16, State 1, Line 45
Invalid column name 'C'.
Msg 207, Level 16, State 1, Line 44
Invalid column name 'C'.
Msg 207, Level 16, State 1, Line 43
Invalid column name 'C'.
Msg 207, Level 16, State 1, Line 42
Invalid column name 'Owner'.
Я попытался найти решение первого сообщения об ошибке и нашел одну существующую ветку (Msg 8180, Уровень 16, Состояние 1, Строка 1 Заявления не могут быть подготовлены. Сообщение 156, уровень 15, состояние 1, строка 1 Неверный синтаксис рядом с ключевым словом "как"), но это не помогло мне решить проблему. Любая помощь будет действительно оценена по устранению проблемы?
Для большого или сложного запроса поверх openquery
я бы предпочел создать представление или хранимую процедуру на удаленном сервере. Таким образом намного проще управлять (кодировать, отлаживать, поддерживать и т. д.).
Двойные кавычки не являются допустимыми разделителями строк, даже если они взаимозаменяемы в других языках, таких как PHP и JavaScript. Двойная кавычка в T-SQL фактически отмечает/разграничивает сущность, а не строковый литерал. Лично я предпочитаю использовать [square brackets]
для разделителей сущностей именно потому, что "double quotes"
делает сущность Смотреть похожей на строковый литерал.
Чтобы использовать строковые литералы в T-SQL, вы можете использовать только одинарные кавычки, а внутри существующей строки вам нужно удвоить их, чтобы избежать их. Попробуйте изменить все это, например.
vp.status = "C"
-- should be
vp.status = ''C''
M.general_description = "Ratepayer"
-- should be
M.general_description = ''Ratepayer''
M.general_description = "Owner"
-- should be
M.general_description = ''Owner''
Выполняется ли запрос, когда он запускается изначально, то есть без использования openquery? Я подозреваю, что так будет намного проще отлаживать.