2

Возможно ли создать хранимую процедуру с использованием cfstoredproc? Когда я запускаю следующее, я получаю Неправильный синтаксис около 'GO'.Создание хранимой процедуры с использованием cfstoredproc

<cffile action="read" file="mypath/myFile.sql" variable="sp_1"> 

<cfstoredproc procedure="sp_executesql" dataSource="#getDatasource()#"> 
    <cfprocparam type="in" cfsqltype = "cf_sql_varchar" value ='#sp_1#'> 
</cfstoredproc> 

myFile.sql

IF OBJECT_ID('getMyData', 'P') IS NOT NULL 
    DROP PROC getMyData 
GO 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE getMyData 
    @some_var AS NVARCHAR(200) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @sql AS NVARCHAR(MAX) 

     SET @sql = N'SELECT * FROM myTable where id = ''' + @some_var + ''' ' 

    EXEC sp_executeSQL @sql 

END 


<cfquery name="createGetMyData" dataSource="#getDatasource()#"> 
    #preservesinglequotes(sp_1)# 
</cfquery> 

result from running cfquery

+0

Если вы запустите этот код в SSMS, он создает процедуру или вызывает ошибку? –

+0

Должен быть чем-то, что диск не любит или неправильно интерпретирует. Единственное, что я вижу, это «PROC» ... Обычно я вижу, что это прописано как ПРОЦЕДУРА. –

+0

Вот еще несколько вещей. входные vars обычно находятся в parens - как в 'CREATE PROCEDURE getMyData (@some_var AS NVARCHAR (200))' Обычно я не вижу точку с запятой после установки nocount (или если я их использую повсюду). Когда указанные идентификаторы включены, я обычно вижу идентификаторы пользователей или dbo, как в [dbo]. [GetMyData] ... и в инструкции select. Я тоже не использую их, просто добавляя это в микс :) ​​ –

ответ

1

Попробуйте это:

<cffile action="read" file="mypath/myFile.sql" variable="sp_1"> 

<cfstoredproc procedure="sp_executesql" dataSource="#getDatasource()#"> 
    <cfprocparam type="in" cfsqltype = "cf_sql_varchar" value ='#preservesinglequotes(sp_1)#'> 
</cfstoredproc> 

ColdFusion ускользает ваши одиночные кавычки в БД переменных.

EDIT:

Во-вторых есть пакетирование заявления. диск выполнит ваш запрос как единый оператор, если ключевое слово «GO» является индикатором подготовленной партии. Другими словами, ваш «ГО» на самом деле является проблемой.

Чтобы исправить это, вам нужно будет запустить 2 запроса - один для удаления, а другой для создания. Зачем? Поскольку CREATE PROCEDURE фактически должен быть первым оператором в заданной партии. в студии MSSQL, используя GO, вы создаете 3 партии, теперь вам нужно выяснить, как их использовать.

Хорошей новостью является то, что ваши ANSI-нули и котировальные идентификаторы, вероятно, не нужны - в большинстве случаев они дефолтны.

Помогает ли это?

+0

По-прежнему получить ту же ошибку Неправильный синтаксис рядом с «GO». Когда я выполняю код для создания хранимой процедуры непосредственно в БД, у меня нет проблемы –

+0

И когда вы пытаетесь использовать cfquery (снова используйте saveesinglequotes())? –

+0

такой же снова с cfquery –