使用cfstoredproc创建存储过程

时间:2014-10-28 14:43:00

标签: stored-procedures coldfusion sql-server-2012 railo cfstoredproc

是否可以使用cfstoredproc 创建存储过程?当我运行以下内容时,我在'GO'附近得到不正确的语法。

<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

1 个答案:

答案 0 :(得分: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在db变量中转义单引号。

编辑:

其次是批量陈述。驱动器会将您的查询批处理为单个语句,而不是&#34; GO&#34; keyword是批量准备的指标。换句话说,你的&#34; GO&#34;实际上是问题。

要解决此问题,您需要运行2个查询 - 一个要删除,另一个要创建。为什么?因为CREATE PROCEDURE实际上必须是给定批次中的第一个语句。在MSSQL工作室中,使用GO,你创建了3批,现在你必须弄清楚如何使用它。

好消息是您的ANSI空值和带引号的标识符可能不需要 - 它们在大多数情况下都是默认的。

这有帮助吗?