我如何得到正确的sql引号字符串的.net DbType

本文关键字:字符串 net DbType sql 何得 | 更新日期: 2023-09-27 18:18:38

我想运行一个ALTER TABLE,为列添加默认值约束。

我从。net程序动态生成这条语句。

如何在构建sql时最好地格式化和引用值-现在ALTER TABLE语句不支持参数(给出错误' ALTER TABLE语句中不允许变量')。

在。net中有这样的实用程序吗?或者其他解决方案?

我如何得到正确的sql引号字符串的.net DbType

您可以在TSQL中这样做;例如,假设您将命令参数化,传入@DefaultValuevarchar,其中可能是或不是有效的TSQL文字。因为我们正在编写DDL,我们将需要连接和exec,但是我们显然不希望盲目地连接,因为该值可能是非法的。幸运的是,quotename做了我们需要的一切。默认情况下,quotename输出[qualified object names],但您可以告诉它以文字转义模式操作,对于单引号和双引号文字。

所以我们接受@DefaultValue的查询可以构建一个SQL字符串:

declare @sql nvarchar(4000) = 'alter table ...';
-- ... blah
-- append the default value; note the result includes the outer quotes
@sql = @sql + quotename(@DefaultValue, '''');
-- ... blah
exec (@sql);

完整的示例:

--drop table FunkyDefaultExample
create table FunkyDefaultExample (id int not null)
declare @tableName varchar(20) = 'FunkyDefaultExample',
        @colName varchar(20) = 'col name',
        @defaultValue varchar(80) = 'test '' with quote';
-- the TSQL we want to generate to exec
/*
alter table [FunkyDefaultExample] add [col name] varchar(50) null
      constraint [col name default] default 'test '' with quote';
*/
declare @sql nvarchar(4000) = 'alter table ' + quotename(@tablename)
    + ' add ' + quotename(@colName) + 'varchar(50) null constraint '
    + quotename(@colName + ' default') + ' default '
    + quotename(@defaultValue, '''');
exec (@sql);
-- tada!

string.Format("alter table YourTable add constraint DF_YourTable_Col1 default '{0}'",
    inputValue.Replace("'", "''"));