有没有办法通过在 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
假设以下临时 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