2014-10-01 64 views
0

如何将这些查询从单个字符串拆分为单个查询数组?SQL查询语法拆分器

例如:

"SELECT * FROM table1; SELECT * FROM table2;" 

[ 
"SELECT * FROM table1;", 
"SELECT * FROM table2;" 
] 

好,我不能使用javascript.split( “;”),因为可以有分号在查询作为值。像

"SELECT * FROM table 1 WHERE col LIKE ';'" 

谢谢。

+2

DECLARE @Text NVARCHAR(MAX) SELECT @Text = '"SELECT * FROM table1; SELECT * FROM table1;","SELECT * FROM table1; SELECT * FROM table2;"' SELECT @Text = REPLACE(@Text,'"','') SELECT @Text = 'SELECT ('''+ REPLACE(@Text,';','''); SELECT(''') + ''')' SELECT @Text = REPLACE(@Text,'; SELECT('''')','') PRINT @Text EXEC (@Text) 

把它分解原生的SQL在JavaScript? – 2014-10-01 07:24:30

+0

如果您将SQL从客户端发送到您的服务器以执行(甚至通过JavaScript更糟糕)......更改您的地址,混淆名称并假装您是摄影师。这是_SQL注入变得简单。从客户端你必须收集/发送参数,查询必须建立在服务器端。 – 2014-10-01 07:28:08

+0

谢谢你们。我实际上是在这里制作一个sql终端。所以我需要来自html的查询。 – kenicky 2014-10-01 08:49:33

回答

0

您可以分割使用分割字符串“;选择”,并在新的字符串的开头添加SELECT(除了第一个)

+0

**任何**文本可能包含在SQL字符串中。简单的字符串分割在这里是不可行的(除非使用更复杂的正则表达式,也考虑字符串分隔符) – 2014-10-01 07:29:30

+0

有没有这样的库? – kenicky 2014-10-01 08:49:51

+0

不能这样做。它并不总是“选择”它可能是插入,更新等。 – kenicky 2014-10-01 12:22:27

-1

使用javascript.split(“;”),因为这是每一个模式行以';'结尾“如果这是不可能在Java中,你可以创建SQL分割字符串函数

+1

'“SELECT * FROM表1 WHERE col LIKE';'”'这个查询之王将在这种解决方案中返回一个错误。 – kenicky 2014-10-01 08:50:44

-1

在这里,您可以如果你想打印

DECLARE @Text NVARCHAR(MAX) 
SELECT @Text = '"SELECT * FROM table1; SELECT * FROM table1;","SELECT * FROM table1; SELECT * FROM table2;"' 
SELECT @Text = REPLACE(@Text,'"','') 
SELECT @Text = 'PRINT ('''+ REPLACE(@Text,';','''); PRINT(''') + ''')' 
SELECT @Text = REPLACE(REPLACE(@Text,' SELECT','SELECT'),',SELECT','SELECT') 
EXEC (@Text) 
+0

这些叫做什么? – kenicky 2014-10-01 12:21:31

+0

这是一些字符串格式化动态SQL不知道如果我的答案是直接你想要的,但我认为你可以用这种方式实现它:) – SubqueryCrunch 2014-10-01 13:00:42

0
var queryStrings = "SELECT * FROM table1; SELECT * FROM table2;" 

// Remove linebreaks; 
var queries = queryStrings.replace(/(\r\n|\n|\r)/gm, ""); 

// Replace ";" delimeter with random string that's unlikely to ever be in a SQL query 
queries = queries.replace(/;/gi, "#&@*^%%)**%123&%"); 

// Split the queries on that random set of characters 
queries = queries.split("#&@*^%%)**%123&%"); 

var cleanQueries = []; 
for (var i = 0; i < queries.length; i++) { 
    // Append a semi-colon after each query 
    if (queries[i]) { 
     var query = queries[i] + ";"; 
     // Trim any white space off the ends; 
     query = query.trim(); 
     cleanQueries.push(query); 
    } 
} 
console.log(cleanQueries) 
// ["SELECT * FROM table1;", "SELECT * FROM table2;"]