【问题标题】:Giving single parameter having commas to SQL stored procedure将具有逗号的单个参数提供给 SQL 存储过程
【发布时间】:2017-09-07 09:29:12
【问题描述】:

我正在使用可视化 FoxPro 和 SQL。我正在使用 SQL 数据在可视 Foxpro 中创建报告。所有连接均已设置。 这是一个存储过程,我想给出像

这样的参数
@A=''AA','BB','CC''

但由于逗号,它的作用就像是程序的单独参数 用于 IN 运算符 例如。 where V_TYPE in (@A)

参数值来自 Visual FoxPro。''AA','BB','CC'' 由 VFP 程序。 这是存储过程的单个参数。 例如。执行 testProc ''AA','BB','CC'' 。 但由于逗号,它的行为就像三个 para 。 引号有问题吗?引用标识符的查看

请告诉我应该如何给出这样的参数。 提前致谢!

【问题讨论】:

  • 您必须为此使用动态 sql。如果你用谷歌搜索,你可以找到很多例子

标签: sql-server stored-procedures visual-foxpro


【解决方案1】:

不幸的是,您得到的建议根本不应该使用,并且对 SQL 注入攻击持开放态度。相反,有多种安全的方法可以做到这一点。 其中之一是在 SQL Server 中创建一个临时表,在其中插入值并使用内部联接而不是 IN 查询。 另一种方法是使用过程将逗号分隔值解析到表服务器端并在连接中使用它。 另一种方法是传递一个 XML 数据字符串,在服务器端创建表并进行连接。下面是一个使用 XML 的示例(其他 2 个示例请看这里 - samples):

 LOCAL lnHandle, cXML, myInQuery

TEXT TO myInQuery noshow
DECLARE @hDoc int
exec sp_xml_preparedocument @hDoc OUTPUT, ?m.cXML

SELECT * FROM [Northwind]..[Products] 
WHERE ProductID IN 
(
    SELECT myID FROM OPENXML(@hDoc, ?m.cNodename, 1) WITH (myid int)
)

EXEC sp_xml_removedocument @hDoc

ENDTEXT


** Local cursor
CREATE CURSOR test (myID i)
INSERT INTO test VALUES (1)
INSERT INTO test VALUES (3)
INSERT INTO test VALUES (5)
** Local cursor

CURSORTOXML('test','cXML',2)

cNodeName = '/VFPData/test' && CursorToXML by default use VFPData as root, and tablename in lowercase for rows

lnHandle = SQLSTRINGCONNECT('Driver={SQL Native Client};server=.\SQLExpress;Trusted_Connection=yes')
SQLEXEC(m.lnHandle, m.myInQuery, 'result')
SQLDISCONNECT(m.lnHandle)

SELECT result
BROWSE

注意:使用这些类型的方法,您的值可以是任何类型,而不必担心其中包含引号或其他字符(int、char、datetime ...)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多