2

是否可以使用 cfstoredproc创建存储过程?当我运行以下命令时,我在 'GO' 附近得到 Incorrect syntax

<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>

我的文件.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>

运行 cfquery 的结果

4

1 回答 1

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 变量中的单引号。

编辑:

其次是语句的批处理。驱动器会将您的查询作为单个语句批处理,而“GO”关键字是准备批处理的指示符。换句话说,您的“GO”实际上就是问题所在。

要修复它,您需要运行 2 个查询 - 一个用于删除,另一个用于创建。为什么?因为 CREATE PROCEDURE 实际上必须是给定批处理中的第一条语句。在 MSSQL Studio 中,使用 GO,您正在创建 3 个批次,现在您必须弄清楚如何使用一个。

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

这有帮助吗?

于 2014-10-28T15:04:39.257 回答