2017-09-15 32 views
2

设想以下临时表被在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在尝试找到一种像这样同步列宽的好方法时遇到了类似的问题。

+1

你可以使用动态SQL,但我想你可能会更好匹配的列大小临时表,不管那个值是用来做什么的。例如如果您使用的是大小为'5'的值,因为这是您要发送的最长值,如果列的预期用途是连接到“varchar(12)”列,则最好使用大小“12”。这样你就不会遇到[隐式转换]问题(https://sqlperformance.com/2013/04/t-sql-queries/implicit-conversion-costs) – SqlZim

回答

3

类似下面应该工作...

DECLARE @sizeParameter INT = 5; 

-- start by creating the temp table as normal. 
-- use any length you want as the default VARCHAR property. 
IF OBJECT_ID('tempdb..#SomeTable', 'U') IS NOT NULL 
DROP TABLE #SomeTable; 

CREATE TABLE #SomeTable (
    SomeStringColumn VARCHAR(1) NOT null 
    ); 

-- use dynamic sql to ALTER the table column based on the parameter value. 
DECLARE @alter NVARCHAR(4000) = CONCAT(N' 
ALTER TABLE #SomeTable ALTER COLUMN SomeStringColumn VARCHAR(', @sizeParameter, ');'); 

EXEC sys.sp_executesql @alter; 

-- verify that the varchar(is now sized properly. 
EXEC tempdb..sp_help #SomeTable; 

结果...

Column_name  Type  Computed Length  Prec Scale Nullable TrimTrailingBlanks FixedLenNullInSource Collation 
----------------- -------- --------- ----------- ----- ----- --------- ------------------- --------------------- ----------------------------- 
SomeStringColumn varchar no  5      yes  no     yes     SQL_Latin1_General_CP1_CI_AS 
相关问题