Сообщение 8180, уровень 16, состояние 1, строка 8 в хранимой процедуре

Я написал оператор 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? Я подозреваю, что так будет намного проще отлаживать.

Dale K 18.05.2022 02:48

Для большого или сложного запроса поверх openquery я бы предпочел создать представление или хранимую процедуру на удаленном сервере. Таким образом намного проще управлять (кодировать, отлаживать, поддерживать и т. д.).

Squirrel 18.05.2022 03:15
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
2
19
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Двойные кавычки не являются допустимыми разделителями строк, даже если они взаимозаменяемы в других языках, таких как 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''

Другие вопросы по теме