13
|
bdukes Jon Skeet · 技术社区 · 6 年前 |
![]() |
1
4
如果你执行你的命令
但这不是你的主要问题。至于为什么不能用
但是,使用动态sql语句可以使用DDL执行
它看起来不漂亮,但很管用:
您还可以将其转换为带有参数的存储过程,而不是运行
|
![]() |
2
2
我强烈建议不要对表名使用动态SQL。您正在为自己设置一些严重的SQL注入问题。你应该验证任何进入
也就是说,在你的例子中。。。
... 您正在尝试输入您的声明
你可以试试:
... 这会给你线。。。
... 然后可以接受你通过的参数。。。
同样,在将任何内容传递到使用动态表名的动态SQL之前,我会使用一些重验证(和白名单)。
|
![]() |
3
2
这种行为是有记录的,尽管不是直观的。相关摘录自 the documentation 在触发限制主题下:
执行参数化查询时,参数声明将被视为批处理的一部分。因此
尝试运行时收到的无效语法错误消息
这至少会导致调用
同样,使用此方法执行另一个参数化语句也会成功运行:
但是,如果在批处理中没有实际使用该参数,则会导致错误
底线是你需要建立
|
![]() |
4
2
简单的答案是 “没有” 你不能 根据 MSDN
你可以查看更多细节 Statement Parameters 问题是什么?
参数只能代替标量文字,如带引号的字符串、日期或数值。你不能参数化一个
我们能做些什么?
我相信你想要使用参数化
有解决办法吗?
如果要使用
这是第一次打电话给
例如
|
![]() |
5
1
答案是 “是的” ,但需要稍作调整:
调整列表:
在这种情况下,这是DDL命令的限制,而不是sp_executesql。DDL语句不能使用变量参数化。Microsoft文档显示:
资料来源: DECLARE (Transact-SQL) 因此,使用EXECUTE的解决方案是我提供的一种解决方案 |
![]() |
6
0
就我个人而言,我讨厌触发器,大多数时候都会尽量避免;) 然而,如果你真的,真的需要这种动态的东西,你应该使用 sp_mForeachTable 并避免以任何代价注射(正如肖恩所指出的):
|
![]() |
7
0
如果要将参数用作字符串,请在参数名称前后添加double 这样地 :
如果要将其用作表名,请使用select而不是print, 这样地:
|