【问题标题】:Is there a way to specify the column length in a temp table through the use of a SQL parameter in SQL Server?有没有办法通过在 SQL Server 中使用 SQL 参数来指定临时表中的列长度?
【发布时间】:2017-09-15 15:29:55
【问题描述】:

假设正在 SQL Server 中创建以下临时表:

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,但我认为您最好将临时表中的列大小与该值的用途相匹配。例如如果您使用 size 5 因为这是您要发送的最长值,那么如果该列的预期用途是加入 varchar(12) 列,则使用 size 12 可能会更好。这样你就不会遇到implicit conversions 的问题

标签: .net sql-server sqlparameter


【解决方案1】:

类似下面的东西应该可以工作...

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

【讨论】:

    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 2011-09-09
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2023-01-21
    • 1970-01-01
    相关资源
    最近更新 更多