【发布时间】:2017-09-15 15:29:55
【问题描述】:
假设正在 SQL Server 中创建以下临时表:
CREATE TABLE #SomeTable
(
SomeColumn varchar(50)
)
现在想象一下,有一些 VB.NET 代码创建了这个表,并且动态地指定了 SomeColumn 的长度,以使其与其他东西保持同步:
command.CommandText = $"
CREATE TABLE #SomeTable(
SomeColumn varchar({If(syncIntValue.HasValue, CStr(syncIntValue.Value), "MAX")})
)"
这种方法有一个问题:它没有使用 SQL 参数,如果操作系统设置被更改,那么在将整数转换为字符串时可能会出现一些不希望的行为。
有没有办法让它使用 SQL 参数?在 SSMS 中提取这些查询时,语法上都无效:
declare @sizeParamName int = 5
CREATE TABLE #SomeTable(SomeColumn varchar(@sizeParamName));
---
declare @sizeParamName int = 5
CREATE TABLE #SomeTable(SomeColumn varchar((@sizeParamName)));
---
declare @sizeParamName int = 5
CREATE TABLE #SomeTable(SomeColumn varchar(select 5));
---
declare @sizeParamName int = 5
CREATE TABLE #SomeTable(SomeColumn varchar((select 5)));
这不是使用 SQL 参数的好兆头(尽管不是确定的),谷歌搜索这也不会带来其他类型的问题(例如人们试图自己设置参数的长度,不在任何列上)。
过去,我通常在不使用临时表的情况下工作,所以这里可能缺少一些东西。有没有好的方法来做到这一点?有没有一种好方法可以将 SQL 参数从 C# 或 VB.NET 传递到用于指定临时表长度的查询?
在这种特定情况下,这样做的原因是数据库内的常规表中有一个列也是varchar,具有特定长度,我想用它来同步SomeColumn的长度与另一列的长度。有时您可以从 SQL Server 中查询类似的元信息,但在这种特殊情况下,我对走哪条路感到复杂;鉴于上述语法问题,看起来注入SomeColumn 也可能很棘手。 Google 在尝试找到一种同步列宽的好方法时遇到了类似的问题。
【问题讨论】:
-
您可以使用动态 sql,但我认为您最好将临时表中的列大小与该值的用途相匹配。例如如果您使用 size
5因为这是您要发送的最长值,那么如果该列的预期用途是加入varchar(12)列,则使用 size12可能会更好。这样你就不会遇到implicit conversions 的问题
标签: .net sql-server sqlparameter