2017-09-15 120 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 
相關問題