2017-02-09 72 views
0

我有一个条件,其中用户将通过像逗号分隔值单引号在T-SQL

0071061386,0071061387 

它将被传递到一个变量,它馈送值到一个动态查询与两个单引号。

用户

declare @s nvarchar(max) = '0071061386,0071061387' 

传递应该是这样转换的用户值后使我可以通过这些值转换为动态查询

declare @s nvarchar(max) = '''0071061386'',''0071061387''' 
+2

而不是继续沿着这条路,你能不能安排用户使用更合适的数据类型的数据传递给你,即一个*设计*来保存多个值,如表值参数或XML类型? –

+5

这是另一个[Bobby Tables](https://xkcd.com/327/)。你**不要**希望用户通过CSV,你**不要**想要创建任何类型的动态查询。如果要向查询发送多个值,请使用表类型,或使用SqlBulkCopy批量插入行。 –

+1

因此,用户输入'1,1);拖放表格命令; - '。你的查询很高兴地把它传递给动态查询,它看到一个*批*的语句,一个插入一条记录,下一个删除一个表。在drop语句之后的任何内容都会被忽略作为注释。 –

回答

1

一个简单的替换为可能在这里做的伎俩,但我相信这是一个XYProblem。也许你最好解释一下导致你走上这条道路的问题。

declare @s nvarchar(max) = '0071061386,0071061387' 

SELECT '''''' + REPLACE(@s, ',', ''''',''''') + '''''' 

结果:

''0071061386'',''0071061387'' 
+0

谢谢它的工作 DECLARE @T nvarchar(max)='0071061386,0071061387' - SELECT''''+替换(@S,',',''',''')+''''' DECLARE @U NVARCHAR(MAX)=(SELECT''''+替换(@T,',',',''')+'''') select @U – aman6496

+2

@AshishMandal Zohar已经提到过,这是一个答案,但你问的是错误的问题。 *为什么*你可以通过CSVs,当你可以传递一个值列表? –

0

试试这个

DECLARE @S NVARCHAR(MAX) = '0071061386,0071061387' 
    SELECT REPLACE(''''''''[email protected]+'''''''',',',''''',''''') 
+0

然后用户输入'1,1);删除表格命令; - '。即使这回答了这个问题,用户所问的是如何自己拍摄脚。 –

+0

谢谢你的工作 DECLARE @T nvarchar(max)='0071061386,0071061387' - SELECT''''+替换(@S,',',''',''')+''''' DECLARE @U NVARCHAR(MAX)=(SELECT''''+替换(@T,',',',''')+'''') select @U – aman6496

+0

@AshishMandal恭喜你,被摧残。法律要一个字。 *解释你的实际问题*,而不是你尝试的破解而不是修复 –