请注意,我也厌倦了根据 Id / Name db 表列编写枚举,从 SSMS 中的查询中复制和粘贴内容。
下面是一个超级脏的存储过程,它以表名、要用于 c# 枚举名的列名和要用于 c# 枚举值的列名作为输入。
我使用的大多数这些表名 a) 以“s”结尾 b) 有一个 [TABLENAME]Id 列并且 c) 有一个 [TABLENAME]Name 列,因此有几个 if 语句将假定该结构,在这种情况下,不需要列名参数。
这些示例的一些背景信息 - 这里的“Stonk”并不是真正的“股票”,而是有点像我使用“stonk”的方式,它的意思是“在一段时间内有一些数字与之相关联的东西" 但这并不重要,它只是具有此 Id / Name 模式的表的示例。它看起来像这样:
CREATE TABLE StonkTypes (
StonkTypeId TINYINT IDENTITY(1,1) PRIMARY KEY NOT NULL,
StonkTypeName VARCHAR(200) NOT NULL CONSTRAINT UQ_StonkTypes_StonkTypeName UNIQUE (StonkTypeName)
)
在我创建 proc 之后,这个语句:
EXEC CreateCSharpEnum 'StonkTypes'
选择这个字符串:
public enum StonkTypes { Stonk = 1, Bond = 2, Index = 3, Fund = 4, Commodity = 5,
PutCallRatio = 6, }
我可以将其复制并粘贴到 C# 文件中。
我有一个 Stonks 表,它有 StonkId 和 StonkName 列,所以这个 exec:
EXEC CreateCSharpEnum 'Stonks'
吐出:
public enum Stonks { SP500 = 1, DowJonesIndustrialAverage = 2, ..... }
但是对于那个枚举,我想使用“符号”列作为枚举名称值,所以:
EXEC CreateCSharpEnum 'Stonks', 'Symbol'
诀窍和渲染:
public enum Stonks { SPY = 1, DIA = 2, ..... }
事不宜迟,这就是这个肮脏的疯狂。是的,很脏,但我对自己很满意——它是构建 C# 代码的 SQL 代码的 SQL 代码。涉及到几个层。
CREATE OR ALTER PROCEDURE CreateCSharpEnum
@TableName VARCHAR(MAX),
@EnumNameColumnName VARCHAR(MAX) = NULL,
@EnumValueColumnName VARCHAR(MAX) = NULL
AS
DECLARE @LastCharOfTableName VARCHAR(1)
SELECT @LastCharOfTableName = RIGHT(@TableName, 1)
PRINT 'Last char = [' + @LastCharOfTableName + ']'
DECLARE @TableNameWithoutS VARCHAR(MAX)
IF UPPER(@LastCharOfTableName) = 'S'
SET @TableNameWithoutS = LEFT(@TableName, LEN(@TableName) - 1)
ELSE
SET @TableNameWithoutS = @TableName
PRINT 'Table name without trailing s = [' + @TableNameWithoutS + ']'
IF @EnumNameColumnName IS NULL
BEGIN
SET @EnumNameColumnName = @TableNameWithoutS + 'Name'
END
PRINT 'name col name = [' + @EnumNameColumnName + ']'
IF @EnumValueColumnName IS NULL
SET @EnumValueColumnName = @TableNameWithoutS + 'Id'
PRINT 'value col name = [' + @EnumValueColumnName + ']'
-- replace spaces and punctuation
SET @EnumNameColumnName = 'REPLACE(' + @EnumNameColumnName + ', '' '', '''')'
SET @EnumNameColumnName = 'REPLACE(' + @EnumNameColumnName + ', ''&'', '''')'
SET @EnumNameColumnName = 'REPLACE(' + @EnumNameColumnName + ', ''.'', '''')'
SET @EnumNameColumnName = 'REPLACE(' + @EnumNameColumnName + ', ''('', '''')'
SET @EnumNameColumnName = 'REPLACE(' + @EnumNameColumnName + ', '')'', '''')'
PRINT 'name col name with replace sql = [' + @EnumNameColumnName + ']'
DECLARE @SqlStr VARCHAR(MAX) = 'SELECT ' + @EnumNameColumnName
+ ' + '' = '''
+ ' + LTRIM(RTRIM(STR(' + @EnumValueColumnName + '))) + '','' FROM ' + @TableName + ' ORDER BY ' + @EnumValueColumnName
PRINT 'sql that gets rows for enum body = [' + @SqlStr + ']'
CREATE TABLE #EnumRowsTemp (s VARCHAR(MAX))
INSERT
INTO #EnumRowsTemp
EXEC(@SqlStr)
--SELECT * FROM #EnumRowsTemp
DECLARE @csharpenumbody VARCHAR(MAX)
SELECT @csharpenumbody = COALESCE(@csharpenumbody + ' ', '') + s FROM #EnumRowsTemp
--PRINT @csharpenumbody
DECLARE @csharpenum VARCHAR(MAX) = 'public enum ' + @TableName + ' { ' + @csharpenumbody + ' }'
PRINT @csharpenum
SELECT @csharpenum
DROP TABLE #EnumRowsTemp
请保持批评。我不明白的一件时髦的事情是,为什么我必须创建和删除这个#EnumRowsTemp 表,而不仅仅是“SELECT INTO #EnumRowsTemp”来动态创建临时表?我不知道答案,我试过了,但没有用。这可能是这段代码中最少的问题......
尽管它可能很脏...我希望这可以为你们中的一些笨蛋节省一点时间。