设想以下临时表被在SQL Server中创建:有没有办法通过在SQL Server中使用SQL参数来指定临时表中的列长度?
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,但我想你可能会更好匹配的列大小临时表,不管那个值是用来做什么的。例如如果您使用的是大小为'5'的值,因为这是您要发送的最长值,如果列的预期用途是连接到“varchar(12)”列,则最好使用大小“12”。这样你就不会遇到[隐式转换]问题(https://sqlperformance.com/2013/04/t-sql-queries/implicit-conversion-costs) – SqlZim