给SQL存储过程提供逗号的单个参数

时间:2017-09-07 09:29:13

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

我正在使用Visual FoxPro和SQL。我正在使用SQL数据在Visual Foxpro中创建报告。所有连接都已设置。 这是一个商店程序,我想提供像

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

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

参数值来自Visual FoxPro。“AA”,“BB”,“CC”由VFP程序提供。 这是存储过程的单个参数。 例如。 EXEC testProc''AA','BB','CC''。 但由于逗号它的行为像三段。 带引号标识符的引用是否存在问题

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

1 个答案:

答案 0 :(得分:2)

不幸的是,您已经获得了根本不应该使用的建议,并且对SQL注入攻击持开放态度。相反,有多种安全的方法可以做到这一点。 其中之一是在SQL服务器中创建临时表,在那里插入值并使用内部联接而不是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 ...)。