有没有办法通过在 SQL 服务器中使用 SQL 参数来指定临时 table 中的列长度?

Is there a way to specify the column length in a temp table through the use of a SQL parameter in SQL Server?

假设以下临时 table 正在 SQL 服务器中创建:

CREATE TABLE #SomeTable
(
    SomeColumn varchar(50)
)

现在假设有一些 VB.NET 代码创建这个 table 并且还动态指定 SomeColumn 的长度,以使其与其他内容保持同步:

command.CommandText = $"
        CREATE TABLE #SomeTable(
           SomeColumn varchar({If(syncIntValue.HasValue, CStr(syncIntValue.Value), "MAX")})
        )"

这种方法有一个问题:它没有使用 SQL 参数,如果 OS 设置被更改,当它将该整数转换为字符串时,您可能会遇到一些不希望的行为.

有什么方法可以让它使用 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 参数的使用,这不是一个好兆头(虽然不是确定的),而且谷歌搜索这会带来其他类型的问题(例如人们试图设置参数本身的长度,而不是任何列的长度)。

过去,我工作时通常不经常使用临时 tables,所以这里可能缺少一些东西。有没有好的方法来做到这一点?有没有一种好方法可以将 C# 或 VB.NET 中的 SQL 参数传递给用于指定临时 table 长度的查询?


在这种特定情况下,这样做的原因是数据库中的常规 table 中有一列也是 varchar 且具有特定长度,我想要使用它来同步 SomeColumn 的长度与其他列的长度。有时您可以从 SQL 服务器查询元信息,但在这种特殊情况下,我对要走哪条路感到很复杂;考虑到上面的语法问题,注入 SomeColumn 看起来也很棘手。 Google 在尝试找到一种同步列宽的好方法时遇到了类似的问题。

像下面这样的东西应该可以工作...

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