如何在T-SQL中转义空字符?

时间:2017-11-12 16:09:45

标签: sql-server tsql

我正在使用不支持参数化查询的库,所以我正在尝试编写一个函数来模拟它们:

let params = [ String "\x00'blah" ] in
Mssql.execute ~params "SELECT $1"

为了测试这个,我发送一个每个ASCII字符的字符串,而且似乎只需要转义的两个字符串是:

  • ' - 需要以''
  • 进行转义
  • \0' - 似乎必须更改为CHAR(0)

null字符部分使我的转义函数变得非常复杂,因为它必须跟踪字符串是否打开以及是否需要添加+。我可以编写一个更简单的版本,将其转换为类似CODE(0)+''''+'a'+'s'+'d'的版本,但我怀疑在向服务器发送兆字节数据时效率非常低。如果我发送一个兆字节的空字符,我的版本也将变得非常低效(不是我打算这样做,但我不喜欢在代码中留下时间炸弹)。

我想知道的是 - 还有其他方法可以逃脱这些空字符吗?

(另外,我错过了什么?我找不到任何文档,因为每个人似乎都认为你可以访问一个不错的T-SQL库。)

编辑:看起来null字符应该在T-SQL中工作,但我遇到了我正在使用的库的限制,它调用了FreeTDS的dbcmd,它假设字符串为null - 终止,我似乎无法找到任何替代功能。看起来重写我正在使用的库来支持真正的参数化查询可能是唯一的选择:\

1 个答案:

答案 0 :(得分:-2)

我不知道你的库,但我知道这个简单的sql操作的好库。该库具有插入,更新或删除记录的简单方法,无需编写SQL命令。还支持Merge命令。它的意思是,如果您不知道该记录是否存在,但您想要保存它。 如果你想加密敏感数据,也有一个方法。

以下是示例;

crypto.SetCryptoKey("DB-TEST-CUST");
dRec cust = new dRec("dbo.customer");
cust.fields["email"] = "john.lennon@gmail.com";
cust.fields["name"] = "John Lennon";
cust.fields["description"] = "John's secret world";
cust.fields["password"] = "abc123xyz".dEncryption();  //encryption text include some special characters, but methods support this.
if (cust.Insert() >= 0)
    return "record inserted";
else
    return "record error:" + db.LastException_Message;

了解更多信息库的网站:https://www.dbdll.com/Documentation