gpt4 book ai didi

.net - 有没有办法通过在 SQL Server 中使用 SQL 参数来指定临时表中的列长度?

转载 作者:行者123 更新时间:2023-12-05 04:09:18 29 4
gpt4 key购买 nike

假设在 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 查询元信息那样,但在这种特殊情况下,我对采用哪种方式有不同的看法;考虑到上面的语法问题,注入(inject)到 SomeColumn 中似乎也很棘手。谷歌在试图找到一种同步列宽的好方法时遇到了类似的问题。

最佳答案

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

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

关于.net - 有没有办法通过在 SQL Server 中使用 SQL 参数来指定临时表中的列长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46243027/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com