設想以下臨時表被在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